From 1791c8fd9640041ea7a55a197e5b3876fca16473 Mon Sep 17 00:00:00 2001 From: Andrew Finke Date: Wed, 8 Jul 2020 23:40:56 -0500 Subject: [PATCH 1/5] dir cleaning --- Project E/Project E.xcodeproj/project.pbxproj | 357 -------- .../xcshareddata/xcschemes/Project E.xcscheme | 78 -- README.md | 4 + .../project.pbxproj | 339 -------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcschemes/WKRArticlesPreviewer.xcscheme | 78 -- .../WKRArticlesPreviewer/AppDelegate.swift | 16 - .../AppIcon.appiconset/Contents.json | 58 -- .../Assets.xcassets/Contents.json | 6 - .../Base.lproj/Main.storyboard | 805 ------------------ .../WKRArticlesPreviewer/Info.plist | 37 - .../WKRArticlesPreviewer/ViewController.swift | 108 --- .../WKRArticlesPreviewer.entitlements | 14 - .../WKRCloudStats.xcodeproj/project.pbxproj | 358 -------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcschemes/WKRCloudStats.xcscheme | 87 -- WKRCloudStats/WKRCloudStats/AppDelegate.swift | 13 - .../WKRCloudStats/Base.lproj/Main.storyboard | 778 ----------------- .../AppIcon.appiconset/Contents.json | 60 -- .../WKRMaxIconRounded copy-1.png | Bin 42664 -> 0 bytes .../AppIcon.appiconset/WKRMaxIconRounded.png | Bin 68865 -> 0 bytes .../CloudStatsAssets.xcassets/Contents.json | 6 - WKRCloudStats/WKRCloudStats/Info.plist | 32 - .../WKRCloudStats/ViewController+Player.swift | 170 ---- .../WKRCloudStats/ViewController+Race.swift | 110 --- .../WKRCloudStats/ViewController.swift | 41 - .../WKRCloudStats/WKRCloudStats.entitlements | 18 - .../project.pbxproj | 375 -------- .../WKRRaceLiveViewer/AppDelegate.swift | 36 - .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 58 -- .../Assets.xcassets/Contents.json | 6 - .../Base.lproj/Main.storyboard | 683 --------------- .../WKRRaceLiveViewer/ContentView.swift | 27 - .../WKRRaceLiveViewer/Info.plist | 30 - .../WKRRaceLiveViewer/Model.swift | 52 -- .../Preview Assets.xcassets/Contents.json | 6 - .../WKRRaceActiveRecordWrapper.swift | 53 -- .../WKRRaceLiveViewer.entitlements | 16 - .../contents.xcworkspacedata | 12 - WikiRaces/WikiRaces.xcodeproj/project.pbxproj | 4 +- 43 files changed, 6 insertions(+), 4966 deletions(-) delete mode 100644 Project E/Project E.xcodeproj/project.pbxproj delete mode 100644 Project E/Project E.xcodeproj/xcshareddata/xcschemes/Project E.xcscheme delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/Contents.json delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift delete mode 100644 WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements delete mode 100644 WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj delete mode 100644 WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme delete mode 100644 WKRCloudStats/WKRCloudStats/AppDelegate.swift delete mode 100644 WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard delete mode 100644 WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded copy-1.png delete mode 100644 WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded.png delete mode 100644 WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json delete mode 100644 WKRCloudStats/WKRCloudStats/Info.plist delete mode 100644 WKRCloudStats/WKRCloudStats/ViewController+Player.swift delete mode 100644 WKRCloudStats/WKRCloudStats/ViewController+Race.swift delete mode 100644 WKRCloudStats/WKRCloudStats/ViewController.swift delete mode 100644 WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift delete mode 100644 WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements diff --git a/Project E/Project E.xcodeproj/project.pbxproj b/Project E/Project E.xcodeproj/project.pbxproj deleted file mode 100644 index d058da7..0000000 --- a/Project E/Project E.xcodeproj/project.pbxproj +++ /dev/null @@ -1,357 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 144C2205241BEDA200176EB5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144C2204241BEDA200176EB5 /* AppDelegate.swift */; }; - 144C2209241BEDA200176EB5 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144C2208241BEDA200176EB5 /* ViewController.swift */; }; - 144C220E241BEDA200176EB5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 144C220D241BEDA200176EB5 /* Assets.xcassets */; }; - 144C2211241BEDA200176EB5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 144C220F241BEDA200176EB5 /* LaunchScreen.storyboard */; }; - 144C2222241BEF5C00176EB5 /* WKRUIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 144C2221241BEF5C00176EB5 /* WKRUIKit.framework */; }; - 144C2223241BEF5C00176EB5 /* WKRUIKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 144C2221241BEF5C00176EB5 /* WKRUIKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 144C2224241BEF5C00176EB5 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 144C2223241BEF5C00176EB5 /* WKRUIKit.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 144C2201241BEDA200176EB5 /* Project E.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Project E.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 144C2204241BEDA200176EB5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 144C2208241BEDA200176EB5 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 144C220D241BEDA200176EB5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 144C2210241BEDA200176EB5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 144C2212241BEDA200176EB5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 144C2221241BEF5C00176EB5 /* WKRUIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = WKRUIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 144C21FE241BEDA200176EB5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 144C2222241BEF5C00176EB5 /* WKRUIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 144C21F8241BEDA200176EB5 = { - isa = PBXGroup; - children = ( - 144C2203241BEDA200176EB5 /* Project E */, - 144C2202241BEDA200176EB5 /* Products */, - 144C2220241BEF5C00176EB5 /* Frameworks */, - ); - sourceTree = ""; - }; - 144C2202241BEDA200176EB5 /* Products */ = { - isa = PBXGroup; - children = ( - 144C2201241BEDA200176EB5 /* Project E.app */, - ); - name = Products; - sourceTree = ""; - }; - 144C2203241BEDA200176EB5 /* Project E */ = { - isa = PBXGroup; - children = ( - 144C2204241BEDA200176EB5 /* AppDelegate.swift */, - 144C2208241BEDA200176EB5 /* ViewController.swift */, - 144C220D241BEDA200176EB5 /* Assets.xcassets */, - 144C220F241BEDA200176EB5 /* LaunchScreen.storyboard */, - 144C2212241BEDA200176EB5 /* Info.plist */, - ); - path = "Project E"; - sourceTree = ""; - }; - 144C2220241BEF5C00176EB5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 144C2221241BEF5C00176EB5 /* WKRUIKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 144C2200241BEDA200176EB5 /* Project E */ = { - isa = PBXNativeTarget; - buildConfigurationList = 144C2215241BEDA200176EB5 /* Build configuration list for PBXNativeTarget "Project E" */; - buildPhases = ( - 144C21FD241BEDA200176EB5 /* Sources */, - 144C21FE241BEDA200176EB5 /* Frameworks */, - 144C21FF241BEDA200176EB5 /* Resources */, - 144C2224241BEF5C00176EB5 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Project E"; - productName = "Project E"; - productReference = 144C2201241BEDA200176EB5 /* Project E.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 144C21F9241BEDA200176EB5 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1130; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "Andrew Finke"; - TargetAttributes = { - 144C2200241BEDA200176EB5 = { - CreatedOnToolsVersion = 11.3.1; - }; - }; - }; - buildConfigurationList = 144C21FC241BEDA200176EB5 /* Build configuration list for PBXProject "Project E" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 144C21F8241BEDA200176EB5; - productRefGroup = 144C2202241BEDA200176EB5 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 144C2200241BEDA200176EB5 /* Project E */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 144C21FF241BEDA200176EB5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 144C2211241BEDA200176EB5 /* LaunchScreen.storyboard in Resources */, - 144C220E241BEDA200176EB5 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 144C21FD241BEDA200176EB5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 144C2209241BEDA200176EB5 /* ViewController.swift in Sources */, - 144C2205241BEDA200176EB5 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 144C220F241BEDA200176EB5 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 144C2210241BEDA200176EB5 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 144C2213241BEDA200176EB5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - 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"; - }; - name = Debug; - }; - 144C2214241BEDA200176EB5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 144C2216241BEDA200176EB5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 72S993BNAV; - INFOPLIST_FILE = "Project E/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.andrewfinke.wikiraces.Project-E"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 144C2217241BEDA200176EB5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 72S993BNAV; - INFOPLIST_FILE = "Project E/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.andrewfinke.wikiraces.Project-E"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 144C21FC241BEDA200176EB5 /* Build configuration list for PBXProject "Project E" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 144C2213241BEDA200176EB5 /* Debug */, - 144C2214241BEDA200176EB5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 144C2215241BEDA200176EB5 /* Build configuration list for PBXNativeTarget "Project E" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 144C2216241BEDA200176EB5 /* Debug */, - 144C2217241BEDA200176EB5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 144C21F9241BEDA200176EB5 /* Project object */; -} diff --git a/Project E/Project E.xcodeproj/xcshareddata/xcschemes/Project E.xcscheme b/Project E/Project E.xcodeproj/xcshareddata/xcschemes/Project E.xcscheme deleted file mode 100644 index bcd645d..0000000 --- a/Project E/Project E.xcodeproj/xcshareddata/xcschemes/Project E.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/README.md b/README.md index 65319d7..5b4ead5 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,7 @@ Feel free to ping me with questions. - Framework responsible for the shared UI across the app. #### /WikiRaces - Contains the main project with the release and multi-window debug targets. + +## Other + +[Spectator Mode Alpha](https://atfinke.github.io/WikiRaces/Spectator) diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj b/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj deleted file mode 100644 index dbf1292..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj +++ /dev/null @@ -1,339 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 1434C25222238E5C0099C53A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434C25122238E5C0099C53A /* AppDelegate.swift */; }; - 1434C25422238E5C0099C53A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434C25322238E5C0099C53A /* ViewController.swift */; }; - 1434C25622238E5D0099C53A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1434C25522238E5D0099C53A /* Assets.xcassets */; }; - 1434C25922238E5D0099C53A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1434C25722238E5D0099C53A /* Main.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 1434C24E22238E5C0099C53A /* WKRArticlesPreviewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKRArticlesPreviewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 1434C25122238E5C0099C53A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 1434C25322238E5C0099C53A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 1434C25522238E5D0099C53A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 1434C25822238E5D0099C53A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 1434C25A22238E5D0099C53A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1434C25B22238E5D0099C53A /* WKRArticlesPreviewer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WKRArticlesPreviewer.entitlements; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1434C24B22238E5C0099C53A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1434C24522238E5C0099C53A = { - isa = PBXGroup; - children = ( - 1434C25022238E5C0099C53A /* WKRArticlesPreviewer */, - 1434C24F22238E5C0099C53A /* Products */, - ); - sourceTree = ""; - }; - 1434C24F22238E5C0099C53A /* Products */ = { - isa = PBXGroup; - children = ( - 1434C24E22238E5C0099C53A /* WKRArticlesPreviewer.app */, - ); - name = Products; - sourceTree = ""; - }; - 1434C25022238E5C0099C53A /* WKRArticlesPreviewer */ = { - isa = PBXGroup; - children = ( - 1434C25122238E5C0099C53A /* AppDelegate.swift */, - 1434C25322238E5C0099C53A /* ViewController.swift */, - 1434C25522238E5D0099C53A /* Assets.xcassets */, - 1434C25722238E5D0099C53A /* Main.storyboard */, - 1434C25A22238E5D0099C53A /* Info.plist */, - 1434C25B22238E5D0099C53A /* WKRArticlesPreviewer.entitlements */, - ); - path = WKRArticlesPreviewer; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 1434C24D22238E5C0099C53A /* WKRArticlesPreviewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1434C25E22238E5D0099C53A /* Build configuration list for PBXNativeTarget "WKRArticlesPreviewer" */; - buildPhases = ( - 1434C24A22238E5C0099C53A /* Sources */, - 1434C24B22238E5C0099C53A /* Frameworks */, - 1434C24C22238E5C0099C53A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WKRArticlesPreviewer; - productName = WKRArticlesPreviewer; - productReference = 1434C24E22238E5C0099C53A /* WKRArticlesPreviewer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 1434C24622238E5C0099C53A /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1100; - ORGANIZATIONNAME = "Andrew Finke"; - TargetAttributes = { - 1434C24D22238E5C0099C53A = { - CreatedOnToolsVersion = 10.2; - SystemCapabilities = { - com.apple.Sandbox = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = 1434C24922238E5C0099C53A /* Build configuration list for PBXProject "WKRArticlesPreviewer" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 1434C24522238E5C0099C53A; - productRefGroup = 1434C24F22238E5C0099C53A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 1434C24D22238E5C0099C53A /* WKRArticlesPreviewer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1434C24C22238E5C0099C53A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1434C25622238E5D0099C53A /* Assets.xcassets in Resources */, - 1434C25922238E5D0099C53A /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1434C24A22238E5C0099C53A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1434C25422238E5C0099C53A /* ViewController.swift in Sources */, - 1434C25222238E5C0099C53A /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 1434C25722238E5D0099C53A /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 1434C25822238E5D0099C53A /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 1434C25C22238E5D0099C53A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 1434C25D22238E5D0099C53A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 1434C25F22238E5D0099C53A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 72S993BNAV; - INFOPLIST_FILE = WKRArticlesPreviewer/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRArticlesPreviewer; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 1434C26022238E5D0099C53A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 72S993BNAV; - INFOPLIST_FILE = WKRArticlesPreviewer/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRArticlesPreviewer; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 1434C24922238E5C0099C53A /* Build configuration list for PBXProject "WKRArticlesPreviewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1434C25C22238E5D0099C53A /* Debug */, - 1434C25D22238E5D0099C53A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1434C25E22238E5D0099C53A /* Build configuration list for PBXNativeTarget "WKRArticlesPreviewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1434C25F22238E5D0099C53A /* Debug */, - 1434C26022238E5D0099C53A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 1434C24622238E5C0099C53A /* Project object */; -} diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme b/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme deleted file mode 100644 index 1848d5a..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift b/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift deleted file mode 100644 index 5e89cee..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// AppDelegate.swift -// WKRArticlesPreviewer -// -// Created by Andrew Finke on 2/24/19. -// Copyright © 2019 Andrew Finke. All rights reserved. -// - -import Cocoa - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { - func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } -} diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json b/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2db2b1c..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "512x512", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/Contents.json b/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard b/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard deleted file mode 100644 index fd2521d..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard +++ /dev/null @@ -1,805 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist b/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist deleted file mode 100644 index bfff29f..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist +++ /dev/null @@ -1,37 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - Copyright © 2019 Andrew Finke. All rights reserved. - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - - - diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift b/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift deleted file mode 100644 index 1e3e7e2..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// ViewController.swift -// WKRArticlesPreviewer -// -// Created by Andrew Finke on 2/24/19. -// Copyright © 2019 Andrew Finke. All rights reserved. -// - -import Cocoa -import WebKit - -class ViewController: NSViewController { - - // MARK: - Properties - - @IBOutlet weak var webView: WKWebView! - var selectButton: NSButton? - - var remainingArticles = [String]() - var keepArticles = [String]() - var removeArticles = [String]() - - var lastArticle = "" - - // MARK: - View Life Cycle - - override func viewDidLoad() { - super.viewDidLoad() - webView.load(URLRequest(url: URL(string: "https://en.m.wikipedia.org")!)) - NSWorkspace.shared.openFile(NSTemporaryDirectory()) - - NSEvent.addLocalMonitorForEvents(matching: .keyUp) { - print($0.keyCode) - if $0.keyCode == 124 { - self.keepArticle(0) - } else if $0.keyCode == 126 { - self.removeArticle(0) - } else if $0.keyCode == 123 { - self.undoLastAction(0) - } else { - return nil - } - return $0 - } - } - - func moveToNextArticle(keepCurrent: Bool) { - let article = remainingArticles.removeFirst() - lastArticle = article - if keepCurrent { - keepArticles.append(article) - } else { - removeArticles.append(article) - } - save(keepArticles, named: "keep") - save(removeArticles, named: "remove") - showNextArticle() - } - - func save(_ array: [String], named name: String) { - let path = NSTemporaryDirectory() + name + ".plist" - NSMutableArray(array: array).write(toFile: path, atomically: false) - } - - func showNextArticle() { - let article = remainingArticles.first ?? "" - guard let url = URL(string: "https://en.m.wikipedia.org/wiki" + article) else { fatalError() } - webView.load(URLRequest(url: url)) - selectButton?.title = remainingArticles.count.description - } - - // MARK: - Actions - - @IBAction func selectArticlesList(_ sender: NSButton) { - let dialog = NSOpenPanel() - dialog.title = "Choose articles file" - dialog.allowsMultipleSelection = false - dialog.allowedFileTypes = ["plist"] - - if dialog.runModal() == .OK, let result = dialog.url { - guard let plist = NSArray(contentsOf: result) as? [String] else { - fatalError() - } - remainingArticles = plist.sorted() - showNextArticle() - } - selectButton = sender - } - - @IBAction func keepArticle(_ sender: Any) { - moveToNextArticle(keepCurrent: true) - } - - @IBAction func removeArticle(_ sender: Any) { - moveToNextArticle(keepCurrent: false) - } - - @IBAction func undoLastAction(_ sender: Any) { - if keepArticles.last == lastArticle { - keepArticles.removeLast() - } else if removeArticles.last == lastArticle { - removeArticles.removeLast() - } - remainingArticles.insert(lastArticle, at: 0) - showNextArticle() - } - -} diff --git a/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements b/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements deleted file mode 100644 index 40b639e..0000000 --- a/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - com.apple.security.network.client - - com.apple.security.network.server - - - diff --git a/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj b/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj deleted file mode 100644 index f6098d8..0000000 --- a/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj +++ /dev/null @@ -1,358 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 144A101F202F9641003DB51A /* ViewController+Player.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144A101E202F9641003DB51A /* ViewController+Player.swift */; }; - 144A1021202F9649003DB51A /* ViewController+Race.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144A1020202F9649003DB51A /* ViewController+Race.swift */; }; - 145623D81F8DE63C00B1ECAC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145623D71F8DE63C00B1ECAC /* AppDelegate.swift */; }; - 145623DA1F8DE63C00B1ECAC /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145623D91F8DE63C00B1ECAC /* ViewController.swift */; }; - 145623DF1F8DE63C00B1ECAC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 145623DD1F8DE63C00B1ECAC /* Main.storyboard */; }; - 145623E91F8DE64F00B1ECAC /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 145623E81F8DE64F00B1ECAC /* CloudKit.framework */; }; - 145623EB1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 145623EA1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 144A101E202F9641003DB51A /* ViewController+Player.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Player.swift"; sourceTree = ""; }; - 144A1020202F9649003DB51A /* ViewController+Race.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Race.swift"; sourceTree = ""; }; - 145623D41F8DE63C00B1ECAC /* WKRCloudStats.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKRCloudStats.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 145623D71F8DE63C00B1ECAC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 145623D91F8DE63C00B1ECAC /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 145623DE1F8DE63C00B1ECAC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 145623E01F8DE63C00B1ECAC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 145623E11F8DE63C00B1ECAC /* WKRCloudStats.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WKRCloudStats.entitlements; sourceTree = ""; }; - 145623E81F8DE64F00B1ECAC /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; - 145623EA1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = CloudStatsAssets.xcassets; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 145623D11F8DE63C00B1ECAC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 145623E91F8DE64F00B1ECAC /* CloudKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 145623CB1F8DE63C00B1ECAC = { - isa = PBXGroup; - children = ( - 145623D61F8DE63C00B1ECAC /* WKRCloudStats */, - 145623D51F8DE63C00B1ECAC /* Products */, - 145623E71F8DE64F00B1ECAC /* Frameworks */, - ); - sourceTree = ""; - }; - 145623D51F8DE63C00B1ECAC /* Products */ = { - isa = PBXGroup; - children = ( - 145623D41F8DE63C00B1ECAC /* WKRCloudStats.app */, - ); - name = Products; - sourceTree = ""; - }; - 145623D61F8DE63C00B1ECAC /* WKRCloudStats */ = { - isa = PBXGroup; - children = ( - 145623D71F8DE63C00B1ECAC /* AppDelegate.swift */, - 145623EA1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets */, - 145623D91F8DE63C00B1ECAC /* ViewController.swift */, - 144A101E202F9641003DB51A /* ViewController+Player.swift */, - 144A1020202F9649003DB51A /* ViewController+Race.swift */, - 145623DD1F8DE63C00B1ECAC /* Main.storyboard */, - 145623E01F8DE63C00B1ECAC /* Info.plist */, - 145623E11F8DE63C00B1ECAC /* WKRCloudStats.entitlements */, - ); - path = WKRCloudStats; - sourceTree = ""; - }; - 145623E71F8DE64F00B1ECAC /* Frameworks */ = { - isa = PBXGroup; - children = ( - 145623E81F8DE64F00B1ECAC /* CloudKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 145623D31F8DE63C00B1ECAC /* WKRCloudStats */ = { - isa = PBXNativeTarget; - buildConfigurationList = 145623E41F8DE63C00B1ECAC /* Build configuration list for PBXNativeTarget "WKRCloudStats" */; - buildPhases = ( - 145623D01F8DE63C00B1ECAC /* Sources */, - 145623D11F8DE63C00B1ECAC /* Frameworks */, - 145623D21F8DE63C00B1ECAC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WKRCloudStats; - productName = WKRCloudStats; - productReference = 145623D41F8DE63C00B1ECAC /* WKRCloudStats.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 145623CC1F8DE63C00B1ECAC /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "Andrew Finke"; - TargetAttributes = { - 145623D31F8DE63C00B1ECAC = { - CreatedOnToolsVersion = 9.0; - LastSwiftMigration = 1020; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Push = { - enabled = 1; - }; - com.apple.Sandbox = { - enabled = 0; - }; - com.apple.iCloud = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = 145623CF1F8DE63C00B1ECAC /* Build configuration list for PBXProject "WKRCloudStats" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 145623CB1F8DE63C00B1ECAC; - productRefGroup = 145623D51F8DE63C00B1ECAC /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 145623D31F8DE63C00B1ECAC /* WKRCloudStats */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 145623D21F8DE63C00B1ECAC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 145623EB1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets in Resources */, - 145623DF1F8DE63C00B1ECAC /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 145623D01F8DE63C00B1ECAC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 145623DA1F8DE63C00B1ECAC /* ViewController.swift in Sources */, - 144A1021202F9649003DB51A /* ViewController+Race.swift in Sources */, - 145623D81F8DE63C00B1ECAC /* AppDelegate.swift in Sources */, - 144A101F202F9641003DB51A /* ViewController+Player.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 145623DD1F8DE63C00B1ECAC /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 145623DE1F8DE63C00B1ECAC /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 145623E21F8DE63C00B1ECAC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 145623E31F8DE63C00B1ECAC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.12; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - }; - name = Release; - }; - 145623E51F8DE63C00B1ECAC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = WKRCloudStats/WKRCloudStats.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 72S993BNAV; - ENABLE_HARDENED_RUNTIME = YES; - INFOPLIST_FILE = WKRCloudStats/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRCloudStats; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 145623E61F8DE63C00B1ECAC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = WKRCloudStats/WKRCloudStats.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = 72S993BNAV; - ENABLE_HARDENED_RUNTIME = YES; - INFOPLIST_FILE = WKRCloudStats/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRCloudStats; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 145623CF1F8DE63C00B1ECAC /* Build configuration list for PBXProject "WKRCloudStats" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 145623E21F8DE63C00B1ECAC /* Debug */, - 145623E31F8DE63C00B1ECAC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 145623E41F8DE63C00B1ECAC /* Build configuration list for PBXNativeTarget "WKRCloudStats" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 145623E51F8DE63C00B1ECAC /* Debug */, - 145623E61F8DE63C00B1ECAC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 145623CC1F8DE63C00B1ECAC /* Project object */; -} diff --git a/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme b/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme deleted file mode 100644 index 818a193..0000000 --- a/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WKRCloudStats/WKRCloudStats/AppDelegate.swift b/WKRCloudStats/WKRCloudStats/AppDelegate.swift deleted file mode 100644 index 576c74d..0000000 --- a/WKRCloudStats/WKRCloudStats/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// AppDelegate.swift -// WKRCloudStats -// -// Created by Andrew Finke on 10/11/17. -// Copyright © 2017 Andrew Finke. All rights reserved. -// - -import Cocoa - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { -} diff --git a/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard b/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard deleted file mode 100644 index 0f355cf..0000000 --- a/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard +++ /dev/null @@ -1,778 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json b/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index ff71006..0000000 --- a/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "16x16", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "32x32", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "128x128", - "scale" : "2x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "1x" - }, - { - "idiom" : "mac", - "size" : "256x256", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "WKRMaxIconRounded copy-1.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "WKRMaxIconRounded.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded copy-1.png b/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded copy-1.png deleted file mode 100644 index 61c468533f83f3856591113516af323e868170df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42664 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

)M2UBBp4NQU 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 diff --git a/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded.png b/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded.png deleted file mode 100644 index 95460fc8c0e7e22a36007037bc5bc9b9c779992e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68865 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≷Owl(w`lfUn8e`+`9NF; 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 F@_*pJN_hYP diff --git a/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json b/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/WKRCloudStats/WKRCloudStats/Info.plist b/WKRCloudStats/WKRCloudStats/Info.plist deleted file mode 100644 index 9adc7e4..0000000 --- a/WKRCloudStats/WKRCloudStats/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - Copyright © 2017 Andrew Finke. All rights reserved. - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication - - diff --git a/WKRCloudStats/WKRCloudStats/ViewController+Player.swift b/WKRCloudStats/WKRCloudStats/ViewController+Player.swift deleted file mode 100644 index 235d003..0000000 --- a/WKRCloudStats/WKRCloudStats/ViewController+Player.swift +++ /dev/null @@ -1,170 +0,0 @@ -// -// ViewController+Player.swift -// WKRCloudStats -// -// Created by Andrew Finke on 2/10/18. -// Copyright © 2018 Andrew Finke. All rights reserved. -// - -import CloudKit -import Cocoa - -extension ViewController { - - // MARK: - CloudKit Querying - - - func queryPlayerStats() { - textView.textStorage?.append(NSAttributedString(string: "Querying Player Stats\n")) - - let recordType = isUsingUserStatsV3 ? "UserStatsv3" : "UserStats" - let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true)) - query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] - - let queryOperation = CKQueryOperation(query: query) - queryOperation.qualityOfService = .userInitiated - queryOperation.recordFetchedBlock = { record in - self.playerRecords.append(record) - } - - queryOperation.queryCompletionBlock = queryPlayerCompleted - publicDB.add(queryOperation) - } - - private func queryPlayerCompleted(cursor: CKQueryOperation.Cursor?, error: Error?) { - DispatchQueue.main.async { - if let error = error { - self.textView.textStorage?.append(NSAttributedString(string: "Error: \(error)\n")) - self.processPlayerStats() - } else if let cursor = cursor { - self.textView.textStorage?.append(NSAttributedString(string: "Querying w/ Cursor \(self.playerRecords.count)\n")) - self.queryPlayerStats(cursor: cursor) - } else { - self.textView.textStorage?.append(NSAttributedString(string: "Got All Player Stats\n")) - self.processPlayerStats() - } - } - } - - private func queryPlayerStats(cursor: CKQueryOperation.Cursor) { - let queryOperation = CKQueryOperation(cursor: cursor) - queryOperation.qualityOfService = .userInitiated - queryOperation.recordFetchedBlock = { record in - self.playerRecords.append(record) - } - - queryOperation.queryCompletionBlock = queryPlayerCompleted - publicDB.add(queryOperation) - } - - // MARK: - Processing - - private func processPlayerStats() { - let v1Keys = [ - "CustomName", - "DeviceName", - "GCAlias", - "Points", - "Races", - "Pages", - "FastestTime", - "TotalTime", - "UniquePlayers", - "TotalPlayers", - "SoloPages", - "SoloRaces", - "SoloTotalTime", - "BundleVersion", - "BundleBuild", - "CreatedAt", - "ModifiedAt" - ] - - let v3Keys = [ - "CustomNames", - "DeviceNames", - "GCAliases", - - "gkFastestTime", - "gkHelp", - "gkInvitedToMatch", - "gkMatch", - "gkPages", - "gkPixelsScrolled", - "gkPoints", - "gkPressedJoin", - "gkRaceDNF", - "gkRaceFinishFirst", - "gkRaceFinishSecond", - "gkRaceFinishThird", - "gkRaces", - "gkTotalPlayers", - "gkTotalTime", - "gkUniquePlayers", - "gkVotes", - "mpcFastestTime", - "mpcHelp", - "mpcMatch", - "mpcPages", - "mpcPixelsScrolled", - "mpcPoints", - "mpcPressedHost", - "mpcPressedJoin", - "mpcRaceDNF", - "mpcRaceFinishFirst", - "mpcRaceFinishSecond", - "mpcRaceFinishThird", - "mpcRaces", - "mpcTotalPlayers", - "mpcTotalTime", - "mpcUniquePlayers", - "mpcVotes", - "multiplayerAverage", - "soloFastestTime", - "soloHelp", - "soloMatch", - "soloPages", - "soloPixelsScrolled", - "soloPressedHost", - "soloRaceDNF", - "soloRaceFinishFirst", - "soloRaces", - "soloTotalTime", - "soloVotes", - "triggeredEasterEgg", - - "osVersion", - "coreVersion", - "coreBuild", - "CreatedAt", - "ModifiedAt" - ] - - let keys = isUsingUserStatsV3 ? v3Keys : v1Keys - - var csvString = "" - for key in keys { - csvString += key + "," - } - csvString += "\n" - for record in playerRecords { - for key in keys { - if let object = record.object(forKey: key) { - csvString += "\(object)".replacingOccurrences(of: ",", with: "|").replacingOccurrences(of: "\n", with: "") - } else if key == "CreatedAt", let date = record.creationDate { - csvString += "\(date)" - } else if key == "ModifiedAt", let date = record.modificationDate { - csvString += "\(date)" - } - csvString += "," - } - csvString += "\n" - } - - let panel = NSSavePanel() - panel.nameFieldStringValue = "WKRCloudStats.csv" - panel.beginSheetModal(for: self.view.window!) { _ in - guard let url = panel.url else { return } - try? csvString.write(to: url, atomically: true, encoding: .utf8) - } - } -} diff --git a/WKRCloudStats/WKRCloudStats/ViewController+Race.swift b/WKRCloudStats/WKRCloudStats/ViewController+Race.swift deleted file mode 100644 index f0e6c18..0000000 --- a/WKRCloudStats/WKRCloudStats/ViewController+Race.swift +++ /dev/null @@ -1,110 +0,0 @@ -// -// ViewController+Race.swift -// WKRCloudStats -// -// Created by Andrew Finke on 2/10/18. -// Copyright © 2018 Andrew Finke. All rights reserved. -// - -import CloudKit -import Cocoa - -extension ViewController { - - // MARK: - CloudKit Querying - - func queryRaceStats() { - textView.textStorage?.append(NSAttributedString(string: "Querying Race Stats\n")) - - let query = CKQuery(recordType: "RaceResult", predicate: NSPredicate(value: true)) - query.sortDescriptors = [NSSortDescriptor(key: "Links", ascending: false)] - - let queryOperation = CKQueryOperation(query: query) - queryOperation.qualityOfService = .userInitiated - queryOperation.recordFetchedBlock = { record in - self.raceRecords.append(record) - } - - queryOperation.queryCompletionBlock = queryRaceCompleted(cursor:error:) - publicDB.add(queryOperation) - } - - private func queryRaceCompleted(cursor: CKQueryOperation.Cursor?, error: Error?) { - - DispatchQueue.main.async { - - if self.raceRecords.count > 200 { - self.processRaceStats() - return - } - - if let error = error { - self.textView.textStorage?.append(NSAttributedString(string: "Error: \(error)\n")) - self.processRaceStats() - } else if let cursor = cursor { - self.textView.textStorage?.append(NSAttributedString(string: "Querying w/ Cursor \(self.raceRecords.count)\n")) - self.queryRaceStats(cursor: cursor) - } else { - self.textView.textStorage?.append(NSAttributedString(string: "Got All Race Stats\n")) - self.processRaceStats() - } - } - } - - private func queryRaceStats(cursor: CKQueryOperation.Cursor) { - let queryOperation = CKQueryOperation(cursor: cursor) - queryOperation.qualityOfService = .userInitiated - queryOperation.recordFetchedBlock = { record in - self.raceRecords.append(record) - } - - queryOperation.queryCompletionBlock = queryRaceCompleted(cursor:error:) - publicDB.add(queryOperation) - } - - // MARK: - Processing - - private func processRaceStats() { - let keys = [ - "Links", - "TotalPlayerTime", - "PlayerCount", - "URL", - "CreatedAt" - ] - - let panel = NSSavePanel() - panel.nameFieldStringValue = "WKRRaceState-" + Date().description - panel.beginSheetModal(for: self.view.window!) { _ in - guard let url = panel.url else { return } - - try? FileManager.default.createDirectory(at: url, - withIntermediateDirectories: false, - attributes: nil) - - var csvString = "" - for key in keys { - csvString += key + "," - } - csvString += "\n" - for (index, record) in self.raceRecords.enumerated() { - for key in keys { - if key == "URL", let assetURL = (record.object(forKey: "CSV") as? CKAsset)?.fileURL { - let fileURL = url.appendingPathComponent("\(index).csv") - try? FileManager.default.copyItem(at: assetURL, to: fileURL) - csvString += "\(fileURL)" - } else if let object = record.object(forKey: key) { - csvString += "\(object)" - } else if key == "CreatedAt", let date = record.creationDate { - csvString += "\(date)" - } - csvString += "," - } - csvString += "\n" - } - try? csvString.write(to: url.appendingPathComponent("Overview.csv"), atomically: false, encoding: .utf8) - - } - - } -} diff --git a/WKRCloudStats/WKRCloudStats/ViewController.swift b/WKRCloudStats/WKRCloudStats/ViewController.swift deleted file mode 100644 index d5e26f5..0000000 --- a/WKRCloudStats/WKRCloudStats/ViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// ViewController.swift -// WKRCloudStats -// -// Created by Andrew Finke on 10/11/17. -// Copyright © 2017 Andrew Finke. All rights reserved. -// - -import Cocoa -import CloudKit - -class ViewController: NSViewController { - - // MARK: - Properties - - - @IBOutlet var textView: NSTextView! - - var raceRecords = [CKRecord]() - var playerRecords = [CKRecord]() - let publicDB = CKContainer(identifier: "iCloud.com.andrewfinke.wikiraces").publicCloudDatabase - - var isUsingUserStatsV3 = true - - // MARK: - View Life Cycle - - - override func viewDidLoad() { - super.viewDidLoad() - textView.textColor = NSColor.labelColor - } - - @IBAction func downloadPlayerStats(_ sender: Any) { - playerRecords = [] - queryPlayerStats() - } - - @IBAction func downloadRaceStats(_ sender: Any) { - raceRecords = [] - queryRaceStats() - } - -} diff --git a/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements b/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements deleted file mode 100644 index a0d37e3..0000000 --- a/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements +++ /dev/null @@ -1,18 +0,0 @@ - - - - - com.apple.developer.aps-environment - development - com.apple.developer.icloud-container-environment - Production - com.apple.developer.icloud-container-identifiers - - iCloud.com.andrewfinke.wikiraces - - com.apple.developer.icloud-services - - CloudKit - - - diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj b/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj deleted file mode 100644 index 2d9de22..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj +++ /dev/null @@ -1,375 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 146E057B24AE40F0001E1917 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E057A24AE40F0001E1917 /* AppDelegate.swift */; }; - 146E057F24AE40F1001E1917 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 146E057E24AE40F1001E1917 /* Assets.xcassets */; }; - 146E058224AE40F1001E1917 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 146E058124AE40F1001E1917 /* Preview Assets.xcassets */; }; - 146E058524AE40F1001E1917 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 146E058324AE40F1001E1917 /* Main.storyboard */; }; - 146E059124AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E058D24AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift */; }; - 146E059224AE4108001E1917 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E058F24AE4108001E1917 /* ContentView.swift */; }; - 146E059324AE4108001E1917 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E059024AE4108001E1917 /* Model.swift */; }; - 146E059624AE427A001E1917 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 146E059524AE427A001E1917 /* CloudKit.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 146E057724AE40F0001E1917 /* WKRRaceLiveViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKRRaceLiveViewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 146E057A24AE40F0001E1917 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 146E057E24AE40F1001E1917 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 146E058124AE40F1001E1917 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 146E058424AE40F1001E1917 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 146E058624AE40F1001E1917 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 146E058D24AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WKRRaceActiveRecordWrapper.swift; sourceTree = ""; }; - 146E058E24AE4108001E1917 /* WKRRaceLiveViewer.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = WKRRaceLiveViewer.entitlements; sourceTree = ""; }; - 146E058F24AE4108001E1917 /* ContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 146E059024AE4108001E1917 /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; - 146E059524AE427A001E1917 /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 146E057424AE40F0001E1917 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 146E059624AE427A001E1917 /* CloudKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 146E056E24AE40F0001E1917 = { - isa = PBXGroup; - children = ( - 146E057924AE40F0001E1917 /* WKRRaceLiveViewer */, - 146E057824AE40F0001E1917 /* Products */, - 146E059424AE427A001E1917 /* Frameworks */, - ); - sourceTree = ""; - }; - 146E057824AE40F0001E1917 /* Products */ = { - isa = PBXGroup; - children = ( - 146E057724AE40F0001E1917 /* WKRRaceLiveViewer.app */, - ); - name = Products; - sourceTree = ""; - }; - 146E057924AE40F0001E1917 /* WKRRaceLiveViewer */ = { - isa = PBXGroup; - children = ( - 146E057A24AE40F0001E1917 /* AppDelegate.swift */, - 146E057E24AE40F1001E1917 /* Assets.xcassets */, - 146E058324AE40F1001E1917 /* Main.storyboard */, - 146E058624AE40F1001E1917 /* Info.plist */, - 146E059024AE4108001E1917 /* Model.swift */, - 146E058F24AE4108001E1917 /* ContentView.swift */, - 146E058D24AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift */, - 146E058E24AE4108001E1917 /* WKRRaceLiveViewer.entitlements */, - 146E058024AE40F1001E1917 /* Preview Content */, - ); - path = WKRRaceLiveViewer; - sourceTree = ""; - }; - 146E058024AE40F1001E1917 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 146E058124AE40F1001E1917 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 146E059424AE427A001E1917 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 146E059524AE427A001E1917 /* CloudKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 146E057624AE40F0001E1917 /* WKRRaceLiveViewer */ = { - isa = PBXNativeTarget; - buildConfigurationList = 146E058A24AE40F1001E1917 /* Build configuration list for PBXNativeTarget "WKRRaceLiveViewer" */; - buildPhases = ( - 146E057324AE40F0001E1917 /* Sources */, - 146E057424AE40F0001E1917 /* Frameworks */, - 146E057524AE40F0001E1917 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WKRRaceLiveViewer; - productName = WKRRaceLiveViewer; - productReference = 146E057724AE40F0001E1917 /* WKRRaceLiveViewer.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 146E056F24AE40F0001E1917 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1200; - LastUpgradeCheck = 1150; - TargetAttributes = { - 146E057624AE40F0001E1917 = { - CreatedOnToolsVersion = 12.0; - }; - }; - }; - buildConfigurationList = 146E057224AE40F0001E1917 /* Build configuration list for PBXProject "WKRRaceLiveViewer" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 146E056E24AE40F0001E1917; - productRefGroup = 146E057824AE40F0001E1917 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 146E057624AE40F0001E1917 /* WKRRaceLiveViewer */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 146E057524AE40F0001E1917 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 146E058524AE40F1001E1917 /* Main.storyboard in Resources */, - 146E058224AE40F1001E1917 /* Preview Assets.xcassets in Resources */, - 146E057F24AE40F1001E1917 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 146E057324AE40F0001E1917 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 146E059324AE4108001E1917 /* Model.swift in Sources */, - 146E059124AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift in Sources */, - 146E059224AE4108001E1917 /* ContentView.swift in Sources */, - 146E057B24AE40F0001E1917 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 146E058324AE40F1001E1917 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 146E058424AE40F1001E1917 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 146E058824AE40F1001E1917 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - 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; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 146E058924AE40F1001E1917 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - 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; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 146E058B24AE40F1001E1917 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_ASSET_PATHS = "\"WKRRaceLiveViewer/Preview Content\""; - DEVELOPMENT_TEAM = 72S993BNAV; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = WKRRaceLiveViewer/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRRaceLiveViewer; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 146E058C24AE40F1001E1917 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements; - CODE_SIGN_IDENTITY = "-"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_ASSET_PATHS = "\"WKRRaceLiveViewer/Preview Content\""; - DEVELOPMENT_TEAM = 72S993BNAV; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = WKRRaceLiveViewer/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRRaceLiveViewer; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 146E057224AE40F0001E1917 /* Build configuration list for PBXProject "WKRRaceLiveViewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 146E058824AE40F1001E1917 /* Debug */, - 146E058924AE40F1001E1917 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 146E058A24AE40F1001E1917 /* Build configuration list for PBXNativeTarget "WKRRaceLiveViewer" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 146E058B24AE40F1001E1917 /* Debug */, - 146E058C24AE40F1001E1917 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 146E056F24AE40F0001E1917 /* Project object */; -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift b/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift deleted file mode 100644 index e69b3f7..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AppDelegate.swift -// WKRRaceLiveViewer -// -// Created by Andrew Finke on 7/2/20. -// - -import Cocoa -import SwiftUI - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate { - - var window: NSWindow! - - func applicationDidFinishLaunching(_ aNotification: Notification) { - // Create the SwiftUI view that provides the window contents. - let contentView = ContentView() - - // Create the window and set the content view. - window = NSWindow( - contentRect: NSRect(x: 0, y: 0, width: 480, height: 300), - styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], - backing: .buffered, defer: false) - window.isReleasedWhenClosed = false - window.center() - window.setFrameAutosaveName("Main Window") - window.contentView = NSHostingView(rootView: contentView) - window.makeKeyAndOrderFront(nil) - } - - func applicationWillTerminate(_ aNotification: Notification) { - // Insert code here to tear down your application - } - -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json b/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json b/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 3f00db4..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json b/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard b/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard deleted file mode 100644 index ad2fe7b..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard +++ /dev/null @@ -1,683 +0,0 @@ - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift b/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift deleted file mode 100644 index 72300da..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// ContentView.swift -// WKRRaceLiveViewer -// -// Created by Andrew Finke on 7/2/20. -// - -import SwiftUI - -struct ContentView: View { - - @ObservedObject var model = Model(raceCode: "buzzard") - - var body: some View { - VStack { - Text("\(model.host ?? "")").padding() - Text("\(model.state?.rawValue.description ?? "-")").padding() - Text("\(model.resultsInfo?._playersForLiveViewer.map({ $0.raceHistory?.entries.last?.page.title }).description ?? "-")").padding() - } - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist b/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist deleted file mode 100644 index cfbbdb7..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSMainStoryboardFile - Main - NSPrincipalClass - NSApplication - - diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift b/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift deleted file mode 100644 index 7414845..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// Model.swift -// WKRRaceLiveViewer -// -// Created by Andrew Finke on 7/2/20. -// - -import CloudKit -import WKRKitCore - -class Model: ObservableObject { - - // MARK: - Properties - - - private let raceCode: String - - @Published var host: String? - @Published var state: WKRGameState? - @Published var resultsInfo: WKRResultsInfo? - - // MARK: - Initalization - - - init(raceCode: String) { - self.raceCode = raceCode - update() - Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in - self.update() - } - } - - // MARK: - Helpers - - - func update() { - let predicate = NSPredicate(format: "Code == %@", raceCode) - let sort = NSSortDescriptor(key: "modificationDate", ascending: false) - let query = CKQuery(recordType: "RaceActive", predicate: predicate) - query.sortDescriptors = [sort] - - let operation = CKQueryOperation(query: query) - operation.resultsLimit = 1 - operation.recordFetchedBlock = { record in - let wrapper = WKRRaceActiveRecordWrapper(record: record) - DispatchQueue.main.async { - self.host = wrapper.host() - self.state = wrapper.state() - self.resultsInfo = wrapper.resultsInfo() - } - } - CKContainer(identifier: "iCloud.com.andrewfinke.wikiraces").publicCloudDatabase.add(operation) - } - -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json b/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift b/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift deleted file mode 100644 index c38ba14..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// WKRRaceLiveRecord.swift -// WKRRaceLiveViewer -// -// Created by Andrew Finke on 7/2/20. -// - -import CloudKit -import WKRKitCore - -struct WKRRaceActiveRecordWrapper { - - // MARK: - Types - - - private enum Key: String { - case version, state, host, code, resultsInfo - } - - // MARK: - Properties - - - private let record: CKRecord - - // MARK: - Initalization - - - init(record: CKRecord) { - self.record = record - } - - // MARK: - Helpers - - - func state() -> WKRGameState? { - guard let value = record[Key.state.rawValue.capitalized] as? Int else { return nil } - return WKRGameState(rawValue: value) - } - - func host() -> String? { - guard let value = record[Key.host.rawValue.capitalized] as? String else { return nil } - return value - } - - func code() -> String? { - guard let value = record[Key.code.rawValue.capitalized] as? String else { return nil } - return value - } - - func resultsInfo() -> WKRResultsInfo? { - guard let value = record["ResultsInfo"] as? CKAsset, - let url = value.fileURL, - let data = try? Data(contentsOf: url), - let object = try? JSONDecoder().decode(WKRResultsInfo.self, from: data) else { return nil } - return object - } -} diff --git a/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements b/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements deleted file mode 100644 index fad366a..0000000 --- a/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements +++ /dev/null @@ -1,16 +0,0 @@ - - - - - com.apple.developer.aps-environment - development - com.apple.developer.icloud-container-identifiers - - iCloud.com.andrewfinke.wikiraces - - com.apple.developer.icloud-services - - CloudKit - - - diff --git a/WikiRaces.xcworkspace/contents.xcworkspacedata b/WikiRaces.xcworkspace/contents.xcworkspacedata index 693f29d..34f40a4 100644 --- a/WikiRaces.xcworkspace/contents.xcworkspacedata +++ b/WikiRaces.xcworkspace/contents.xcworkspacedata @@ -10,16 +10,4 @@ - - - - - - - - diff --git a/WikiRaces/WikiRaces.xcodeproj/project.pbxproj b/WikiRaces/WikiRaces.xcodeproj/project.pbxproj index a6c26aa..07c583d 100644 --- a/WikiRaces/WikiRaces.xcodeproj/project.pbxproj +++ b/WikiRaces/WikiRaces.xcodeproj/project.pbxproj @@ -2341,7 +2341,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2020.07; + MARKETING_VERSION = 2020.07.2; OTHER_LDFLAGS = "-ObjC"; OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-function-bodies=300 -Xfrontend -warn-long-expression-type-checking=150"; PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.wikiraces; @@ -2376,7 +2376,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2020.07; + MARKETING_VERSION = 2020.07.2; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.wikiraces; PRODUCT_NAME = "$(TARGET_NAME)"; From 47bc448ff72a60f5d996928f1f1ac4edf9e35853 Mon Sep 17 00:00:00 2001 From: Andrew Finke Date: Wed, 8 Jul 2020 23:41:47 -0500 Subject: [PATCH 2/5] dir cleaning --- .../project.pbxproj | 339 ++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/WKRArticlesPreviewer.xcscheme | 78 ++ .../WKRArticlesPreviewer/AppDelegate.swift | 16 + .../AppIcon.appiconset/Contents.json | 58 ++ .../Assets.xcassets/Contents.json | 0 .../Base.lproj/Main.storyboard | 805 ++++++++++++++++++ .../WKRArticlesPreviewer/Info.plist | 37 + .../WKRArticlesPreviewer/ViewController.swift | 108 +++ .../WKRArticlesPreviewer.entitlements | 14 + .../WKRCloudStats.xcodeproj/project.pbxproj | 358 ++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/WKRCloudStats.xcscheme | 87 ++ .../WKRCloudStats/AppDelegate.swift | 13 + .../WKRCloudStats/Base.lproj/Main.storyboard | 778 +++++++++++++++++ .../AppIcon.appiconset/Contents.json | 60 ++ .../WKRMaxIconRounded copy-1.png | Bin 0 -> 42664 bytes .../AppIcon.appiconset/WKRMaxIconRounded.png | Bin 0 -> 68865 bytes .../CloudStatsAssets.xcassets/Contents.json | 6 + .../WKRCloudStats/WKRCloudStats/Info.plist | 32 + .../WKRCloudStats/ViewController+Player.swift | 170 ++++ .../WKRCloudStats/ViewController+Race.swift | 110 +++ .../WKRCloudStats/ViewController.swift | 41 + .../WKRCloudStats/WKRCloudStats.entitlements | 18 + .../project.pbxproj | 375 ++++++++ .../WKRRaceLiveViewer/AppDelegate.swift | 36 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 58 ++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/Main.storyboard | 683 +++++++++++++++ .../WKRRaceLiveViewer/ContentView.swift | 27 + .../WKRRaceLiveViewer/Info.plist | 30 + .../WKRRaceLiveViewer/Model.swift | 52 ++ .../Preview Assets.xcassets/Contents.json | 6 + .../WKRRaceActiveRecordWrapper.swift | 53 ++ .../WKRRaceLiveViewer.entitlements | 16 + Project E/Project E/AppDelegate.swift | 30 - .../AppIcon.appiconset/Contents.json | 98 --- .../Base.lproj/LaunchScreen.storyboard | 25 - Project E/Project E/Info.plist | 45 - Project E/Project E/ViewController.swift | 18 - 43 files changed, 4511 insertions(+), 216 deletions(-) create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json rename {Project E/Project E => Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer}/Assets.xcassets/Contents.json (100%) create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift create mode 100644 Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/AppDelegate.swift create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded copy-1.png create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded.png create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/Info.plist create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Player.swift create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Race.swift create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/ViewController.swift create mode 100644 Mac Utils/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift create mode 100644 Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements delete mode 100644 Project E/Project E/AppDelegate.swift delete mode 100644 Project E/Project E/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Project E/Project E/Base.lproj/LaunchScreen.storyboard delete mode 100644 Project E/Project E/Info.plist delete mode 100644 Project E/Project E/ViewController.swift diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dbf1292 --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.pbxproj @@ -0,0 +1,339 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1434C25222238E5C0099C53A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434C25122238E5C0099C53A /* AppDelegate.swift */; }; + 1434C25422238E5C0099C53A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1434C25322238E5C0099C53A /* ViewController.swift */; }; + 1434C25622238E5D0099C53A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1434C25522238E5D0099C53A /* Assets.xcassets */; }; + 1434C25922238E5D0099C53A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1434C25722238E5D0099C53A /* Main.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1434C24E22238E5C0099C53A /* WKRArticlesPreviewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKRArticlesPreviewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1434C25122238E5C0099C53A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 1434C25322238E5C0099C53A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 1434C25522238E5D0099C53A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1434C25822238E5D0099C53A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 1434C25A22238E5D0099C53A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1434C25B22238E5D0099C53A /* WKRArticlesPreviewer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WKRArticlesPreviewer.entitlements; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1434C24B22238E5C0099C53A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1434C24522238E5C0099C53A = { + isa = PBXGroup; + children = ( + 1434C25022238E5C0099C53A /* WKRArticlesPreviewer */, + 1434C24F22238E5C0099C53A /* Products */, + ); + sourceTree = ""; + }; + 1434C24F22238E5C0099C53A /* Products */ = { + isa = PBXGroup; + children = ( + 1434C24E22238E5C0099C53A /* WKRArticlesPreviewer.app */, + ); + name = Products; + sourceTree = ""; + }; + 1434C25022238E5C0099C53A /* WKRArticlesPreviewer */ = { + isa = PBXGroup; + children = ( + 1434C25122238E5C0099C53A /* AppDelegate.swift */, + 1434C25322238E5C0099C53A /* ViewController.swift */, + 1434C25522238E5D0099C53A /* Assets.xcassets */, + 1434C25722238E5D0099C53A /* Main.storyboard */, + 1434C25A22238E5D0099C53A /* Info.plist */, + 1434C25B22238E5D0099C53A /* WKRArticlesPreviewer.entitlements */, + ); + path = WKRArticlesPreviewer; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1434C24D22238E5C0099C53A /* WKRArticlesPreviewer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1434C25E22238E5D0099C53A /* Build configuration list for PBXNativeTarget "WKRArticlesPreviewer" */; + buildPhases = ( + 1434C24A22238E5C0099C53A /* Sources */, + 1434C24B22238E5C0099C53A /* Frameworks */, + 1434C24C22238E5C0099C53A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WKRArticlesPreviewer; + productName = WKRArticlesPreviewer; + productReference = 1434C24E22238E5C0099C53A /* WKRArticlesPreviewer.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1434C24622238E5C0099C53A /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1020; + LastUpgradeCheck = 1100; + ORGANIZATIONNAME = "Andrew Finke"; + TargetAttributes = { + 1434C24D22238E5C0099C53A = { + CreatedOnToolsVersion = 10.2; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + }; + }; + buildConfigurationList = 1434C24922238E5C0099C53A /* Build configuration list for PBXProject "WKRArticlesPreviewer" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1434C24522238E5C0099C53A; + productRefGroup = 1434C24F22238E5C0099C53A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1434C24D22238E5C0099C53A /* WKRArticlesPreviewer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1434C24C22238E5C0099C53A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1434C25622238E5D0099C53A /* Assets.xcassets in Resources */, + 1434C25922238E5D0099C53A /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1434C24A22238E5C0099C53A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1434C25422238E5C0099C53A /* ViewController.swift in Sources */, + 1434C25222238E5C0099C53A /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 1434C25722238E5D0099C53A /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1434C25822238E5D0099C53A /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1434C25C22238E5D0099C53A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1434C25D22238E5D0099C53A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 1434C25F22238E5D0099C53A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 72S993BNAV; + INFOPLIST_FILE = WKRArticlesPreviewer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRArticlesPreviewer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 1434C26022238E5D0099C53A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 72S993BNAV; + INFOPLIST_FILE = WKRArticlesPreviewer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRArticlesPreviewer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1434C24922238E5C0099C53A /* Build configuration list for PBXProject "WKRArticlesPreviewer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1434C25C22238E5D0099C53A /* Debug */, + 1434C25D22238E5D0099C53A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1434C25E22238E5D0099C53A /* Build configuration list for PBXNativeTarget "WKRArticlesPreviewer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1434C25F22238E5D0099C53A /* Debug */, + 1434C26022238E5D0099C53A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1434C24622238E5C0099C53A /* Project object */; +} diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme new file mode 100644 index 0000000..1848d5a --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer.xcodeproj/xcshareddata/xcschemes/WKRArticlesPreviewer.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift new file mode 100644 index 0000000..5e89cee --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/AppDelegate.swift @@ -0,0 +1,16 @@ +// +// AppDelegate.swift +// WKRArticlesPreviewer +// +// Created by Andrew Finke on 2/24/19. +// Copyright © 2019 Andrew Finke. All rights reserved. +// + +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2db2b1c --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project E/Project E/Assets.xcassets/Contents.json b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/Contents.json similarity index 100% rename from Project E/Project E/Assets.xcassets/Contents.json rename to Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Assets.xcassets/Contents.json diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard new file mode 100644 index 0000000..fd2521d --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Base.lproj/Main.storyboard @@ -0,0 +1,805 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist new file mode 100644 index 0000000..bfff29f --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/Info.plist @@ -0,0 +1,37 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + Copyright © 2019 Andrew Finke. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift new file mode 100644 index 0000000..1e3e7e2 --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/ViewController.swift @@ -0,0 +1,108 @@ +// +// ViewController.swift +// WKRArticlesPreviewer +// +// Created by Andrew Finke on 2/24/19. +// Copyright © 2019 Andrew Finke. All rights reserved. +// + +import Cocoa +import WebKit + +class ViewController: NSViewController { + + // MARK: - Properties + + @IBOutlet weak var webView: WKWebView! + var selectButton: NSButton? + + var remainingArticles = [String]() + var keepArticles = [String]() + var removeArticles = [String]() + + var lastArticle = "" + + // MARK: - View Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + webView.load(URLRequest(url: URL(string: "https://en.m.wikipedia.org")!)) + NSWorkspace.shared.openFile(NSTemporaryDirectory()) + + NSEvent.addLocalMonitorForEvents(matching: .keyUp) { + print($0.keyCode) + if $0.keyCode == 124 { + self.keepArticle(0) + } else if $0.keyCode == 126 { + self.removeArticle(0) + } else if $0.keyCode == 123 { + self.undoLastAction(0) + } else { + return nil + } + return $0 + } + } + + func moveToNextArticle(keepCurrent: Bool) { + let article = remainingArticles.removeFirst() + lastArticle = article + if keepCurrent { + keepArticles.append(article) + } else { + removeArticles.append(article) + } + save(keepArticles, named: "keep") + save(removeArticles, named: "remove") + showNextArticle() + } + + func save(_ array: [String], named name: String) { + let path = NSTemporaryDirectory() + name + ".plist" + NSMutableArray(array: array).write(toFile: path, atomically: false) + } + + func showNextArticle() { + let article = remainingArticles.first ?? "" + guard let url = URL(string: "https://en.m.wikipedia.org/wiki" + article) else { fatalError() } + webView.load(URLRequest(url: url)) + selectButton?.title = remainingArticles.count.description + } + + // MARK: - Actions + + @IBAction func selectArticlesList(_ sender: NSButton) { + let dialog = NSOpenPanel() + dialog.title = "Choose articles file" + dialog.allowsMultipleSelection = false + dialog.allowedFileTypes = ["plist"] + + if dialog.runModal() == .OK, let result = dialog.url { + guard let plist = NSArray(contentsOf: result) as? [String] else { + fatalError() + } + remainingArticles = plist.sorted() + showNextArticle() + } + selectButton = sender + } + + @IBAction func keepArticle(_ sender: Any) { + moveToNextArticle(keepCurrent: true) + } + + @IBAction func removeArticle(_ sender: Any) { + moveToNextArticle(keepCurrent: false) + } + + @IBAction func undoLastAction(_ sender: Any) { + if keepArticles.last == lastArticle { + keepArticles.removeLast() + } else if removeArticles.last == lastArticle { + removeArticles.removeLast() + } + remainingArticles.insert(lastArticle, at: 0) + showNextArticle() + } + +} diff --git a/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements new file mode 100644 index 0000000..40b639e --- /dev/null +++ b/Mac Utils/WKRArticlesPreviewer/WKRArticlesPreviewer/WKRArticlesPreviewer.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f6098d8 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.pbxproj @@ -0,0 +1,358 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 144A101F202F9641003DB51A /* ViewController+Player.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144A101E202F9641003DB51A /* ViewController+Player.swift */; }; + 144A1021202F9649003DB51A /* ViewController+Race.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144A1020202F9649003DB51A /* ViewController+Race.swift */; }; + 145623D81F8DE63C00B1ECAC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145623D71F8DE63C00B1ECAC /* AppDelegate.swift */; }; + 145623DA1F8DE63C00B1ECAC /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145623D91F8DE63C00B1ECAC /* ViewController.swift */; }; + 145623DF1F8DE63C00B1ECAC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 145623DD1F8DE63C00B1ECAC /* Main.storyboard */; }; + 145623E91F8DE64F00B1ECAC /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 145623E81F8DE64F00B1ECAC /* CloudKit.framework */; }; + 145623EB1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 145623EA1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 144A101E202F9641003DB51A /* ViewController+Player.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Player.swift"; sourceTree = ""; }; + 144A1020202F9649003DB51A /* ViewController+Race.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Race.swift"; sourceTree = ""; }; + 145623D41F8DE63C00B1ECAC /* WKRCloudStats.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKRCloudStats.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 145623D71F8DE63C00B1ECAC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 145623D91F8DE63C00B1ECAC /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 145623DE1F8DE63C00B1ECAC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 145623E01F8DE63C00B1ECAC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 145623E11F8DE63C00B1ECAC /* WKRCloudStats.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WKRCloudStats.entitlements; sourceTree = ""; }; + 145623E81F8DE64F00B1ECAC /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; + 145623EA1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = CloudStatsAssets.xcassets; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 145623D11F8DE63C00B1ECAC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 145623E91F8DE64F00B1ECAC /* CloudKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 145623CB1F8DE63C00B1ECAC = { + isa = PBXGroup; + children = ( + 145623D61F8DE63C00B1ECAC /* WKRCloudStats */, + 145623D51F8DE63C00B1ECAC /* Products */, + 145623E71F8DE64F00B1ECAC /* Frameworks */, + ); + sourceTree = ""; + }; + 145623D51F8DE63C00B1ECAC /* Products */ = { + isa = PBXGroup; + children = ( + 145623D41F8DE63C00B1ECAC /* WKRCloudStats.app */, + ); + name = Products; + sourceTree = ""; + }; + 145623D61F8DE63C00B1ECAC /* WKRCloudStats */ = { + isa = PBXGroup; + children = ( + 145623D71F8DE63C00B1ECAC /* AppDelegate.swift */, + 145623EA1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets */, + 145623D91F8DE63C00B1ECAC /* ViewController.swift */, + 144A101E202F9641003DB51A /* ViewController+Player.swift */, + 144A1020202F9649003DB51A /* ViewController+Race.swift */, + 145623DD1F8DE63C00B1ECAC /* Main.storyboard */, + 145623E01F8DE63C00B1ECAC /* Info.plist */, + 145623E11F8DE63C00B1ECAC /* WKRCloudStats.entitlements */, + ); + path = WKRCloudStats; + sourceTree = ""; + }; + 145623E71F8DE64F00B1ECAC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 145623E81F8DE64F00B1ECAC /* CloudKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 145623D31F8DE63C00B1ECAC /* WKRCloudStats */ = { + isa = PBXNativeTarget; + buildConfigurationList = 145623E41F8DE63C00B1ECAC /* Build configuration list for PBXNativeTarget "WKRCloudStats" */; + buildPhases = ( + 145623D01F8DE63C00B1ECAC /* Sources */, + 145623D11F8DE63C00B1ECAC /* Frameworks */, + 145623D21F8DE63C00B1ECAC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WKRCloudStats; + productName = WKRCloudStats; + productReference = 145623D41F8DE63C00B1ECAC /* WKRCloudStats.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 145623CC1F8DE63C00B1ECAC /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Andrew Finke"; + TargetAttributes = { + 145623D31F8DE63C00B1ECAC = { + CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Push = { + enabled = 1; + }; + com.apple.Sandbox = { + enabled = 0; + }; + com.apple.iCloud = { + enabled = 1; + }; + }; + }; + }; + }; + buildConfigurationList = 145623CF1F8DE63C00B1ECAC /* Build configuration list for PBXProject "WKRCloudStats" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 145623CB1F8DE63C00B1ECAC; + productRefGroup = 145623D51F8DE63C00B1ECAC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 145623D31F8DE63C00B1ECAC /* WKRCloudStats */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 145623D21F8DE63C00B1ECAC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 145623EB1F8DF11A00B1ECAC /* CloudStatsAssets.xcassets in Resources */, + 145623DF1F8DE63C00B1ECAC /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 145623D01F8DE63C00B1ECAC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 145623DA1F8DE63C00B1ECAC /* ViewController.swift in Sources */, + 144A1021202F9649003DB51A /* ViewController+Race.swift in Sources */, + 145623D81F8DE63C00B1ECAC /* AppDelegate.swift in Sources */, + 144A101F202F9641003DB51A /* ViewController+Player.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 145623DD1F8DE63C00B1ECAC /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 145623DE1F8DE63C00B1ECAC /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 145623E21F8DE63C00B1ECAC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 145623E31F8DE63C00B1ECAC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Mac Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + }; + name = Release; + }; + 145623E51F8DE63C00B1ECAC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = WKRCloudStats/WKRCloudStats.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 72S993BNAV; + ENABLE_HARDENED_RUNTIME = YES; + INFOPLIST_FILE = WKRCloudStats/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRCloudStats; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 145623E61F8DE63C00B1ECAC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = WKRCloudStats/WKRCloudStats.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 72S993BNAV; + ENABLE_HARDENED_RUNTIME = YES; + INFOPLIST_FILE = WKRCloudStats/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRCloudStats; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 145623CF1F8DE63C00B1ECAC /* Build configuration list for PBXProject "WKRCloudStats" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 145623E21F8DE63C00B1ECAC /* Debug */, + 145623E31F8DE63C00B1ECAC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 145623E41F8DE63C00B1ECAC /* Build configuration list for PBXNativeTarget "WKRCloudStats" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 145623E51F8DE63C00B1ECAC /* Debug */, + 145623E61F8DE63C00B1ECAC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 145623CC1F8DE63C00B1ECAC /* Project object */; +} diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme new file mode 100644 index 0000000..818a193 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats.xcodeproj/xcshareddata/xcschemes/WKRCloudStats.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/AppDelegate.swift b/Mac Utils/WKRCloudStats/WKRCloudStats/AppDelegate.swift new file mode 100644 index 0000000..576c74d --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/AppDelegate.swift @@ -0,0 +1,13 @@ +// +// AppDelegate.swift +// WKRCloudStats +// +// Created by Andrew Finke on 10/11/17. +// Copyright © 2017 Andrew Finke. All rights reserved. +// + +import Cocoa + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { +} diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard b/Mac Utils/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard new file mode 100644 index 0000000..0f355cf --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/Base.lproj/Main.storyboard @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json b/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..ff71006 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,60 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "WKRMaxIconRounded copy-1.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "WKRMaxIconRounded.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded copy-1.png b/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded copy-1.png new file mode 100644 index 0000000000000000000000000000000000000000..61c468533f83f3856591113516af323e868170df GIT binary patch literal 42664 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift new file mode 100644 index 0000000..72300da --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/ContentView.swift @@ -0,0 +1,27 @@ +// +// ContentView.swift +// WKRRaceLiveViewer +// +// Created by Andrew Finke on 7/2/20. +// + +import SwiftUI + +struct ContentView: View { + + @ObservedObject var model = Model(raceCode: "buzzard") + + var body: some View { + VStack { + Text("\(model.host ?? "")").padding() + Text("\(model.state?.rawValue.description ?? "-")").padding() + Text("\(model.resultsInfo?._playersForLiveViewer.map({ $0.raceHistory?.entries.last?.page.title }).description ?? "-")").padding() + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist new file mode 100644 index 0000000..cfbbdb7 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift new file mode 100644 index 0000000..7414845 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Model.swift @@ -0,0 +1,52 @@ +// +// Model.swift +// WKRRaceLiveViewer +// +// Created by Andrew Finke on 7/2/20. +// + +import CloudKit +import WKRKitCore + +class Model: ObservableObject { + + // MARK: - Properties - + + private let raceCode: String + + @Published var host: String? + @Published var state: WKRGameState? + @Published var resultsInfo: WKRResultsInfo? + + // MARK: - Initalization - + + init(raceCode: String) { + self.raceCode = raceCode + update() + Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in + self.update() + } + } + + // MARK: - Helpers - + + func update() { + let predicate = NSPredicate(format: "Code == %@", raceCode) + let sort = NSSortDescriptor(key: "modificationDate", ascending: false) + let query = CKQuery(recordType: "RaceActive", predicate: predicate) + query.sortDescriptors = [sort] + + let operation = CKQueryOperation(query: query) + operation.resultsLimit = 1 + operation.recordFetchedBlock = { record in + let wrapper = WKRRaceActiveRecordWrapper(record: record) + DispatchQueue.main.async { + self.host = wrapper.host() + self.state = wrapper.state() + self.resultsInfo = wrapper.resultsInfo() + } + } + CKContainer(identifier: "iCloud.com.andrewfinke.wikiraces").publicCloudDatabase.add(operation) + } + +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift new file mode 100644 index 0000000..c38ba14 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceActiveRecordWrapper.swift @@ -0,0 +1,53 @@ +// +// WKRRaceLiveRecord.swift +// WKRRaceLiveViewer +// +// Created by Andrew Finke on 7/2/20. +// + +import CloudKit +import WKRKitCore + +struct WKRRaceActiveRecordWrapper { + + // MARK: - Types - + + private enum Key: String { + case version, state, host, code, resultsInfo + } + + // MARK: - Properties - + + private let record: CKRecord + + // MARK: - Initalization - + + init(record: CKRecord) { + self.record = record + } + + // MARK: - Helpers - + + func state() -> WKRGameState? { + guard let value = record[Key.state.rawValue.capitalized] as? Int else { return nil } + return WKRGameState(rawValue: value) + } + + func host() -> String? { + guard let value = record[Key.host.rawValue.capitalized] as? String else { return nil } + return value + } + + func code() -> String? { + guard let value = record[Key.code.rawValue.capitalized] as? String else { return nil } + return value + } + + func resultsInfo() -> WKRResultsInfo? { + guard let value = record["ResultsInfo"] as? CKAsset, + let url = value.fileURL, + let data = try? Data(contentsOf: url), + let object = try? JSONDecoder().decode(WKRResultsInfo.self, from: data) else { return nil } + return object + } +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements new file mode 100644 index 0000000..fad366a --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements @@ -0,0 +1,16 @@ + + + + + com.apple.developer.aps-environment + development + com.apple.developer.icloud-container-identifiers + + iCloud.com.andrewfinke.wikiraces + + com.apple.developer.icloud-services + + CloudKit + + + diff --git a/Project E/Project E/AppDelegate.swift b/Project E/Project E/AppDelegate.swift deleted file mode 100644 index 87e55da..0000000 --- a/Project E/Project E/AppDelegate.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// AppDelegate.swift -// Project E -// -// Created by Andrew Finke on 3/13/20. -// Copyright © 2020 Andrew Finke. All rights reserved. -// - -import UIKit -import WKRUIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: WKRUIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - - window = WKRUIWindow(frame: UIScreen.main.bounds) - let controller = UIViewController() - let nav = WKRUINavigationController(rootViewController: controller) - nav.setNavigationBarHidden(true, animated: false) - window?.rootViewController = nav - window?.makeKeyAndVisible() - - return true - } - -} diff --git a/Project E/Project E/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project E/Project E/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d8db8d6..0000000 --- a/Project E/Project E/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project E/Project E/Base.lproj/LaunchScreen.storyboard b/Project E/Project E/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 865e932..0000000 --- a/Project E/Project E/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project E/Project E/Info.plist b/Project E/Project E/Info.plist deleted file mode 100644 index a354cdb..0000000 --- a/Project E/Project E/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - ITSAppUsesNonExemptEncryption - - - diff --git a/Project E/Project E/ViewController.swift b/Project E/Project E/ViewController.swift deleted file mode 100644 index 78f97ff..0000000 --- a/Project E/Project E/ViewController.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// ViewController.swift -// Project E -// -// Created by Andrew Finke on 3/13/20. -// Copyright © 2020 Andrew Finke. All rights reserved. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - -} From e558ac9c3ec6ad7c1d8c713ea6997ad7e90562d1 Mon Sep 17 00:00:00 2001 From: Andrew Finke Date: Wed, 8 Jul 2020 23:47:56 -0500 Subject: [PATCH 3/5] killswitch work --- WKRKit/WKRKit/Info.plist | 2 +- WKRUIKit/WKRUIKit/Info.plist | 2 +- .../PlusViewController/PlusStore.swift | 17 +++++++++++++++++ WikiRaces/WikiRaces/Info.plist | 2 +- docs/Killswitch.html | 3 +-- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/WKRKit/WKRKit/Info.plist b/WKRKit/WKRKit/Info.plist index a79a077..fbafb32 100644 --- a/WKRKit/WKRKit/Info.plist +++ b/WKRKit/WKRKit/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 13074 + 13079 NSPrincipalClass diff --git a/WKRUIKit/WKRUIKit/Info.plist b/WKRUIKit/WKRUIKit/Info.plist index de89ff3..0eb78eb 100644 --- a/WKRUIKit/WKRUIKit/Info.plist +++ b/WKRUIKit/WKRUIKit/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 13977 + 13982 NSPrincipalClass diff --git a/WikiRaces/Shared/Menu View Controllers/PlusViewController/PlusStore.swift b/WikiRaces/Shared/Menu View Controllers/PlusViewController/PlusStore.swift index 57481d8..aca7f03 100644 --- a/WikiRaces/Shared/Menu View Controllers/PlusViewController/PlusStore.swift +++ b/WikiRaces/Shared/Menu View Controllers/PlusViewController/PlusStore.swift @@ -49,11 +49,15 @@ class PlusStore: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserv private var paymentQueueTransactions: [SKPaymentTransaction] = [] private let paymentQueueTransactionsQueue = DispatchQueue(label: "com.andrewfinke.wikiraces.store.queue", qos: .userInitiated) + var isDead = false var isPlus: Bool { set { UserDefaults.standard.set(newValue, forKey: "isPlus") } get { + if isDead { + return true + } #if targetEnvironment(simulator) return true #else @@ -67,6 +71,19 @@ class PlusStore: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserv private override init() { super.init() queue.add(self) + + guard let url = URL(string: "https://atfinke.github.io/WikiRaces/Killswitch") else { + return + } + let task = URLSession.shared.dataTask(with: url) { data, _, _ in + if let data = data, + let str = String(data: data, encoding: .utf8), + let val = Int(str), + val == 1 { + self.isDead = true + } + } + task.resume() } // MARK: - Helpers - diff --git a/WikiRaces/WikiRaces/Info.plist b/WikiRaces/WikiRaces/Info.plist index 211b80d..2825ecf 100644 --- a/WikiRaces/WikiRaces/Info.plist +++ b/WikiRaces/WikiRaces/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 8768 + 8773 ITSAppUsesNonExemptEncryption LSApplicationCategoryType diff --git a/docs/Killswitch.html b/docs/Killswitch.html index d438c9f..c227083 100644 --- a/docs/Killswitch.html +++ b/docs/Killswitch.html @@ -1,2 +1 @@ - -0 +0 \ No newline at end of file From af27b748128d51352e9c0c62d947212ead114dd3 Mon Sep 17 00:00:00 2001 From: Andrew Finke Date: Wed, 8 Jul 2020 23:54:19 -0500 Subject: [PATCH 4/5] image fixes --- WKRKit/WKRKit/Info.plist | 2 +- WKRUIKit/WKRUIKit/Info.plist | 2 +- WKRUIKit/WKRUIKit/WKRPlayerProfile.swift | 2 +- .../WKRUIKit/WKRUIPlayerImageManager.swift | 16 +++++++--- WKRUIKit/WKRUIKit/WKRUIPlayerImageView.swift | 2 +- .../SwiftUI/PlayerImageView.swift | 29 ------------------- WikiRaces/WikiRaces/Info.plist | 2 +- 7 files changed, 17 insertions(+), 38 deletions(-) delete mode 100644 WikiRaces/Shared/Menu View Controllers/Connect View Controllers/GKHostViewController/SwiftUI/PlayerImageView.swift diff --git a/WKRKit/WKRKit/Info.plist b/WKRKit/WKRKit/Info.plist index fbafb32..fd6ecbb 100644 --- a/WKRKit/WKRKit/Info.plist +++ b/WKRKit/WKRKit/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 13079 + 13081 NSPrincipalClass diff --git a/WKRUIKit/WKRUIKit/Info.plist b/WKRUIKit/WKRUIKit/Info.plist index 0eb78eb..5741472 100644 --- a/WKRUIKit/WKRUIKit/Info.plist +++ b/WKRUIKit/WKRUIKit/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 13982 + 13984 NSPrincipalClass diff --git a/WKRUIKit/WKRUIKit/WKRPlayerProfile.swift b/WKRUIKit/WKRUIKit/WKRPlayerProfile.swift index b069b54..3ee2f7a 100644 --- a/WKRUIKit/WKRUIKit/WKRPlayerProfile.swift +++ b/WKRUIKit/WKRUIKit/WKRPlayerProfile.swift @@ -21,7 +21,7 @@ public struct WKRPlayerProfile: Identifiable, Equatable, Hashable, Codable { public let playerID: String public var image: Image { Image(uiImage: rawImage) } - public var rawImage: UIImage { WKRUIPlayerImageManager.shared.image(for: id) } + public var rawImage: UIImage { WKRUIPlayerImageManager.shared.image(for: name) } // MARK: - Initalization - diff --git a/WKRUIKit/WKRUIKit/WKRUIPlayerImageManager.swift b/WKRUIKit/WKRUIKit/WKRUIPlayerImageManager.swift index fe9696d..0943bc0 100644 --- a/WKRUIKit/WKRUIKit/WKRUIPlayerImageManager.swift +++ b/WKRUIKit/WKRUIKit/WKRUIPlayerImageManager.swift @@ -70,6 +70,14 @@ public class WKRUIPlayerImageManager { } } } + + @discardableResult + private func generatePlaceholder(for player: String) -> UIImage { + let placeholder = WKRUIPlayerPlaceholderImageRenderer.render(name: player) + os_log("%{public}s: generated placeholder for %{public}s", log: .imageManager, type: .info, #function, player) + update(image: placeholder, for: player) + return placeholder + } private func update(image: UIImage, for playerID: String) { if playerID == GKLocalPlayer.local.alias { @@ -79,13 +87,13 @@ public class WKRUIPlayerImageManager { } } - public func image(for playerID: String) -> UIImage { - if playerID == GKLocalPlayer.local.alias, let image = localPlayerImage { + public func image(for player: String) -> UIImage { + if player == GKLocalPlayer.local.displayName, let image = localPlayerImage { return image - } else if let image = connectedPlayerImages[playerID] { + } else if let image = connectedPlayerImages[player] { return image } else { - fatalError() + return generatePlaceholder(for: player) } } diff --git a/WKRUIKit/WKRUIKit/WKRUIPlayerImageView.swift b/WKRUIKit/WKRUIKit/WKRUIPlayerImageView.swift index 0374b1d..e5ff728 100644 --- a/WKRUIKit/WKRUIKit/WKRUIPlayerImageView.swift +++ b/WKRUIKit/WKRUIKit/WKRUIPlayerImageView.swift @@ -19,7 +19,7 @@ public struct WKRUIPlayerImageView: View { // MARK: - Body - public var body: some View { - Image(uiImage: WKRUIPlayerImageManager.shared.image(for: player.playerID)) + Image(uiImage: WKRUIPlayerImageManager.shared.image(for: player.name)) .renderingMode(.original) .resizable() .frame(width: size, height: size) diff --git a/WikiRaces/Shared/Menu View Controllers/Connect View Controllers/GKHostViewController/SwiftUI/PlayerImageView.swift b/WikiRaces/Shared/Menu View Controllers/Connect View Controllers/GKHostViewController/SwiftUI/PlayerImageView.swift deleted file mode 100644 index be9994e..0000000 --- a/WikiRaces/Shared/Menu View Controllers/Connect View Controllers/GKHostViewController/SwiftUI/PlayerImageView.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// PlayerImageView.swift -// WikiRaces -// -// Created by Andrew Finke on 6/25/20. -// Copyright © 2020 Andrew Finke. All rights reserved. -// - -import SwiftUI - -struct PlayerImageView: View { - - // MARK: - Properties - - - let player: SwiftUIPlayer - let size: CGFloat - let effectSize: CGFloat - - // MARK: - Body - - - var body: some View { - PlayerImageDatabase.shared.image(for: player.id) - .renderingMode(.original) - .resizable() - .frame(width: size, height: size) - .clipShape(Circle()) - .shadow(radius: effectSize) - } -} diff --git a/WikiRaces/WikiRaces/Info.plist b/WikiRaces/WikiRaces/Info.plist index 2825ecf..4c55a3a 100644 --- a/WikiRaces/WikiRaces/Info.plist +++ b/WikiRaces/WikiRaces/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 8773 + 8775 ITSAppUsesNonExemptEncryption LSApplicationCategoryType From d19912827670cf7dfcc23862b0d6b68006ab84d4 Mon Sep 17 00:00:00 2001 From: Andrew Finke Date: Wed, 8 Jul 2020 23:57:47 -0500 Subject: [PATCH 5/5] GM --- WKRKit/WKRKit/Info.plist | 2 +- WKRUIKit/WKRUIKit/Info.plist | 2 +- WikiRaces/WikiRaces/Info.plist | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WKRKit/WKRKit/Info.plist b/WKRKit/WKRKit/Info.plist index fd6ecbb..af46f53 100644 --- a/WKRKit/WKRKit/Info.plist +++ b/WKRKit/WKRKit/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 13081 + 13082 NSPrincipalClass diff --git a/WKRUIKit/WKRUIKit/Info.plist b/WKRUIKit/WKRUIKit/Info.plist index 5741472..a40a2cf 100644 --- a/WKRUIKit/WKRUIKit/Info.plist +++ b/WKRUIKit/WKRUIKit/Info.plist @@ -17,7 +17,7 @@ CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion - 13984 + 13985 NSPrincipalClass diff --git a/WikiRaces/WikiRaces/Info.plist b/WikiRaces/WikiRaces/Info.plist index 4c55a3a..d1a7ad1 100644 --- a/WikiRaces/WikiRaces/Info.plist +++ b/WikiRaces/WikiRaces/Info.plist @@ -30,7 +30,7 @@ CFBundleVersion - 8775 + 8776 ITSAppUsesNonExemptEncryption LSApplicationCategoryType

)M2UBBp4NQU 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 literal 0 HcmV?d00001 diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded.png b/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/AppIcon.appiconset/WKRMaxIconRounded.png new file mode 100644 index 0000000000000000000000000000000000000000..95460fc8c0e7e22a36007037bc5bc9b9c779992e GIT binary patch literal 68865 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≷Owl(w`lfUn8e`+`9NF; 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 F@_*pJN_hYP literal 0 HcmV?d00001 diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json b/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/CloudStatsAssets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/Info.plist b/Mac Utils/WKRCloudStats/WKRCloudStats/Info.plist new file mode 100644 index 0000000..9adc7e4 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + Copyright © 2017 Andrew Finke. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Player.swift b/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Player.swift new file mode 100644 index 0000000..235d003 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Player.swift @@ -0,0 +1,170 @@ +// +// ViewController+Player.swift +// WKRCloudStats +// +// Created by Andrew Finke on 2/10/18. +// Copyright © 2018 Andrew Finke. All rights reserved. +// + +import CloudKit +import Cocoa + +extension ViewController { + + // MARK: - CloudKit Querying - + + func queryPlayerStats() { + textView.textStorage?.append(NSAttributedString(string: "Querying Player Stats\n")) + + let recordType = isUsingUserStatsV3 ? "UserStatsv3" : "UserStats" + let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true)) + query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] + + let queryOperation = CKQueryOperation(query: query) + queryOperation.qualityOfService = .userInitiated + queryOperation.recordFetchedBlock = { record in + self.playerRecords.append(record) + } + + queryOperation.queryCompletionBlock = queryPlayerCompleted + publicDB.add(queryOperation) + } + + private func queryPlayerCompleted(cursor: CKQueryOperation.Cursor?, error: Error?) { + DispatchQueue.main.async { + if let error = error { + self.textView.textStorage?.append(NSAttributedString(string: "Error: \(error)\n")) + self.processPlayerStats() + } else if let cursor = cursor { + self.textView.textStorage?.append(NSAttributedString(string: "Querying w/ Cursor \(self.playerRecords.count)\n")) + self.queryPlayerStats(cursor: cursor) + } else { + self.textView.textStorage?.append(NSAttributedString(string: "Got All Player Stats\n")) + self.processPlayerStats() + } + } + } + + private func queryPlayerStats(cursor: CKQueryOperation.Cursor) { + let queryOperation = CKQueryOperation(cursor: cursor) + queryOperation.qualityOfService = .userInitiated + queryOperation.recordFetchedBlock = { record in + self.playerRecords.append(record) + } + + queryOperation.queryCompletionBlock = queryPlayerCompleted + publicDB.add(queryOperation) + } + + // MARK: - Processing + + private func processPlayerStats() { + let v1Keys = [ + "CustomName", + "DeviceName", + "GCAlias", + "Points", + "Races", + "Pages", + "FastestTime", + "TotalTime", + "UniquePlayers", + "TotalPlayers", + "SoloPages", + "SoloRaces", + "SoloTotalTime", + "BundleVersion", + "BundleBuild", + "CreatedAt", + "ModifiedAt" + ] + + let v3Keys = [ + "CustomNames", + "DeviceNames", + "GCAliases", + + "gkFastestTime", + "gkHelp", + "gkInvitedToMatch", + "gkMatch", + "gkPages", + "gkPixelsScrolled", + "gkPoints", + "gkPressedJoin", + "gkRaceDNF", + "gkRaceFinishFirst", + "gkRaceFinishSecond", + "gkRaceFinishThird", + "gkRaces", + "gkTotalPlayers", + "gkTotalTime", + "gkUniquePlayers", + "gkVotes", + "mpcFastestTime", + "mpcHelp", + "mpcMatch", + "mpcPages", + "mpcPixelsScrolled", + "mpcPoints", + "mpcPressedHost", + "mpcPressedJoin", + "mpcRaceDNF", + "mpcRaceFinishFirst", + "mpcRaceFinishSecond", + "mpcRaceFinishThird", + "mpcRaces", + "mpcTotalPlayers", + "mpcTotalTime", + "mpcUniquePlayers", + "mpcVotes", + "multiplayerAverage", + "soloFastestTime", + "soloHelp", + "soloMatch", + "soloPages", + "soloPixelsScrolled", + "soloPressedHost", + "soloRaceDNF", + "soloRaceFinishFirst", + "soloRaces", + "soloTotalTime", + "soloVotes", + "triggeredEasterEgg", + + "osVersion", + "coreVersion", + "coreBuild", + "CreatedAt", + "ModifiedAt" + ] + + let keys = isUsingUserStatsV3 ? v3Keys : v1Keys + + var csvString = "" + for key in keys { + csvString += key + "," + } + csvString += "\n" + for record in playerRecords { + for key in keys { + if let object = record.object(forKey: key) { + csvString += "\(object)".replacingOccurrences(of: ",", with: "|").replacingOccurrences(of: "\n", with: "") + } else if key == "CreatedAt", let date = record.creationDate { + csvString += "\(date)" + } else if key == "ModifiedAt", let date = record.modificationDate { + csvString += "\(date)" + } + csvString += "," + } + csvString += "\n" + } + + let panel = NSSavePanel() + panel.nameFieldStringValue = "WKRCloudStats.csv" + panel.beginSheetModal(for: self.view.window!) { _ in + guard let url = panel.url else { return } + try? csvString.write(to: url, atomically: true, encoding: .utf8) + } + } +} diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Race.swift b/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Race.swift new file mode 100644 index 0000000..f0e6c18 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController+Race.swift @@ -0,0 +1,110 @@ +// +// ViewController+Race.swift +// WKRCloudStats +// +// Created by Andrew Finke on 2/10/18. +// Copyright © 2018 Andrew Finke. All rights reserved. +// + +import CloudKit +import Cocoa + +extension ViewController { + + // MARK: - CloudKit Querying + + func queryRaceStats() { + textView.textStorage?.append(NSAttributedString(string: "Querying Race Stats\n")) + + let query = CKQuery(recordType: "RaceResult", predicate: NSPredicate(value: true)) + query.sortDescriptors = [NSSortDescriptor(key: "Links", ascending: false)] + + let queryOperation = CKQueryOperation(query: query) + queryOperation.qualityOfService = .userInitiated + queryOperation.recordFetchedBlock = { record in + self.raceRecords.append(record) + } + + queryOperation.queryCompletionBlock = queryRaceCompleted(cursor:error:) + publicDB.add(queryOperation) + } + + private func queryRaceCompleted(cursor: CKQueryOperation.Cursor?, error: Error?) { + + DispatchQueue.main.async { + + if self.raceRecords.count > 200 { + self.processRaceStats() + return + } + + if let error = error { + self.textView.textStorage?.append(NSAttributedString(string: "Error: \(error)\n")) + self.processRaceStats() + } else if let cursor = cursor { + self.textView.textStorage?.append(NSAttributedString(string: "Querying w/ Cursor \(self.raceRecords.count)\n")) + self.queryRaceStats(cursor: cursor) + } else { + self.textView.textStorage?.append(NSAttributedString(string: "Got All Race Stats\n")) + self.processRaceStats() + } + } + } + + private func queryRaceStats(cursor: CKQueryOperation.Cursor) { + let queryOperation = CKQueryOperation(cursor: cursor) + queryOperation.qualityOfService = .userInitiated + queryOperation.recordFetchedBlock = { record in + self.raceRecords.append(record) + } + + queryOperation.queryCompletionBlock = queryRaceCompleted(cursor:error:) + publicDB.add(queryOperation) + } + + // MARK: - Processing + + private func processRaceStats() { + let keys = [ + "Links", + "TotalPlayerTime", + "PlayerCount", + "URL", + "CreatedAt" + ] + + let panel = NSSavePanel() + panel.nameFieldStringValue = "WKRRaceState-" + Date().description + panel.beginSheetModal(for: self.view.window!) { _ in + guard let url = panel.url else { return } + + try? FileManager.default.createDirectory(at: url, + withIntermediateDirectories: false, + attributes: nil) + + var csvString = "" + for key in keys { + csvString += key + "," + } + csvString += "\n" + for (index, record) in self.raceRecords.enumerated() { + for key in keys { + if key == "URL", let assetURL = (record.object(forKey: "CSV") as? CKAsset)?.fileURL { + let fileURL = url.appendingPathComponent("\(index).csv") + try? FileManager.default.copyItem(at: assetURL, to: fileURL) + csvString += "\(fileURL)" + } else if let object = record.object(forKey: key) { + csvString += "\(object)" + } else if key == "CreatedAt", let date = record.creationDate { + csvString += "\(date)" + } + csvString += "," + } + csvString += "\n" + } + try? csvString.write(to: url.appendingPathComponent("Overview.csv"), atomically: false, encoding: .utf8) + + } + + } +} diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController.swift b/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController.swift new file mode 100644 index 0000000..d5e26f5 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/ViewController.swift @@ -0,0 +1,41 @@ +// +// ViewController.swift +// WKRCloudStats +// +// Created by Andrew Finke on 10/11/17. +// Copyright © 2017 Andrew Finke. All rights reserved. +// + +import Cocoa +import CloudKit + +class ViewController: NSViewController { + + // MARK: - Properties - + + @IBOutlet var textView: NSTextView! + + var raceRecords = [CKRecord]() + var playerRecords = [CKRecord]() + let publicDB = CKContainer(identifier: "iCloud.com.andrewfinke.wikiraces").publicCloudDatabase + + var isUsingUserStatsV3 = true + + // MARK: - View Life Cycle - + + override func viewDidLoad() { + super.viewDidLoad() + textView.textColor = NSColor.labelColor + } + + @IBAction func downloadPlayerStats(_ sender: Any) { + playerRecords = [] + queryPlayerStats() + } + + @IBAction func downloadRaceStats(_ sender: Any) { + raceRecords = [] + queryRaceStats() + } + +} diff --git a/Mac Utils/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements b/Mac Utils/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements new file mode 100644 index 0000000..a0d37e3 --- /dev/null +++ b/Mac Utils/WKRCloudStats/WKRCloudStats/WKRCloudStats.entitlements @@ -0,0 +1,18 @@ + + + + + com.apple.developer.aps-environment + development + com.apple.developer.icloud-container-environment + Production + com.apple.developer.icloud-container-identifiers + + iCloud.com.andrewfinke.wikiraces + + com.apple.developer.icloud-services + + CloudKit + + + diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2d9de22 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer.xcodeproj/project.pbxproj @@ -0,0 +1,375 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 146E057B24AE40F0001E1917 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E057A24AE40F0001E1917 /* AppDelegate.swift */; }; + 146E057F24AE40F1001E1917 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 146E057E24AE40F1001E1917 /* Assets.xcassets */; }; + 146E058224AE40F1001E1917 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 146E058124AE40F1001E1917 /* Preview Assets.xcassets */; }; + 146E058524AE40F1001E1917 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 146E058324AE40F1001E1917 /* Main.storyboard */; }; + 146E059124AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E058D24AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift */; }; + 146E059224AE4108001E1917 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E058F24AE4108001E1917 /* ContentView.swift */; }; + 146E059324AE4108001E1917 /* Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146E059024AE4108001E1917 /* Model.swift */; }; + 146E059624AE427A001E1917 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 146E059524AE427A001E1917 /* CloudKit.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 146E057724AE40F0001E1917 /* WKRRaceLiveViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKRRaceLiveViewer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 146E057A24AE40F0001E1917 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 146E057E24AE40F1001E1917 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 146E058124AE40F1001E1917 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 146E058424AE40F1001E1917 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 146E058624AE40F1001E1917 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 146E058D24AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WKRRaceActiveRecordWrapper.swift; sourceTree = ""; }; + 146E058E24AE4108001E1917 /* WKRRaceLiveViewer.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = WKRRaceLiveViewer.entitlements; sourceTree = ""; }; + 146E058F24AE4108001E1917 /* ContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 146E059024AE4108001E1917 /* Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Model.swift; sourceTree = ""; }; + 146E059524AE427A001E1917 /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 146E057424AE40F0001E1917 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 146E059624AE427A001E1917 /* CloudKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 146E056E24AE40F0001E1917 = { + isa = PBXGroup; + children = ( + 146E057924AE40F0001E1917 /* WKRRaceLiveViewer */, + 146E057824AE40F0001E1917 /* Products */, + 146E059424AE427A001E1917 /* Frameworks */, + ); + sourceTree = ""; + }; + 146E057824AE40F0001E1917 /* Products */ = { + isa = PBXGroup; + children = ( + 146E057724AE40F0001E1917 /* WKRRaceLiveViewer.app */, + ); + name = Products; + sourceTree = ""; + }; + 146E057924AE40F0001E1917 /* WKRRaceLiveViewer */ = { + isa = PBXGroup; + children = ( + 146E057A24AE40F0001E1917 /* AppDelegate.swift */, + 146E057E24AE40F1001E1917 /* Assets.xcassets */, + 146E058324AE40F1001E1917 /* Main.storyboard */, + 146E058624AE40F1001E1917 /* Info.plist */, + 146E059024AE4108001E1917 /* Model.swift */, + 146E058F24AE4108001E1917 /* ContentView.swift */, + 146E058D24AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift */, + 146E058E24AE4108001E1917 /* WKRRaceLiveViewer.entitlements */, + 146E058024AE40F1001E1917 /* Preview Content */, + ); + path = WKRRaceLiveViewer; + sourceTree = ""; + }; + 146E058024AE40F1001E1917 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 146E058124AE40F1001E1917 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 146E059424AE427A001E1917 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 146E059524AE427A001E1917 /* CloudKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 146E057624AE40F0001E1917 /* WKRRaceLiveViewer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 146E058A24AE40F1001E1917 /* Build configuration list for PBXNativeTarget "WKRRaceLiveViewer" */; + buildPhases = ( + 146E057324AE40F0001E1917 /* Sources */, + 146E057424AE40F0001E1917 /* Frameworks */, + 146E057524AE40F0001E1917 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WKRRaceLiveViewer; + productName = WKRRaceLiveViewer; + productReference = 146E057724AE40F0001E1917 /* WKRRaceLiveViewer.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 146E056F24AE40F0001E1917 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1200; + LastUpgradeCheck = 1150; + TargetAttributes = { + 146E057624AE40F0001E1917 = { + CreatedOnToolsVersion = 12.0; + }; + }; + }; + buildConfigurationList = 146E057224AE40F0001E1917 /* Build configuration list for PBXProject "WKRRaceLiveViewer" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 146E056E24AE40F0001E1917; + productRefGroup = 146E057824AE40F0001E1917 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 146E057624AE40F0001E1917 /* WKRRaceLiveViewer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 146E057524AE40F0001E1917 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 146E058524AE40F1001E1917 /* Main.storyboard in Resources */, + 146E058224AE40F1001E1917 /* Preview Assets.xcassets in Resources */, + 146E057F24AE40F1001E1917 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 146E057324AE40F0001E1917 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 146E059324AE4108001E1917 /* Model.swift in Sources */, + 146E059124AE4108001E1917 /* WKRRaceActiveRecordWrapper.swift in Sources */, + 146E059224AE4108001E1917 /* ContentView.swift in Sources */, + 146E057B24AE40F0001E1917 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 146E058324AE40F1001E1917 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 146E058424AE40F1001E1917 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 146E058824AE40F1001E1917 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + 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; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 146E058924AE40F1001E1917 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + 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; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 146E058B24AE40F1001E1917 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_ASSET_PATHS = "\"WKRRaceLiveViewer/Preview Content\""; + DEVELOPMENT_TEAM = 72S993BNAV; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = WKRRaceLiveViewer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRRaceLiveViewer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 146E058C24AE40F1001E1917 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = WKRRaceLiveViewer/WKRRaceLiveViewer.entitlements; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_ASSET_PATHS = "\"WKRRaceLiveViewer/Preview Content\""; + DEVELOPMENT_TEAM = 72S993BNAV; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = WKRRaceLiveViewer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_BUNDLE_IDENTIFIER = com.andrewfinke.WKRRaceLiveViewer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 146E057224AE40F0001E1917 /* Build configuration list for PBXProject "WKRRaceLiveViewer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 146E058824AE40F1001E1917 /* Debug */, + 146E058924AE40F1001E1917 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 146E058A24AE40F1001E1917 /* Build configuration list for PBXNativeTarget "WKRRaceLiveViewer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 146E058B24AE40F1001E1917 /* Debug */, + 146E058C24AE40F1001E1917 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 146E056F24AE40F0001E1917 /* Project object */; +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift new file mode 100644 index 0000000..e69b3f7 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// WKRRaceLiveViewer +// +// Created by Andrew Finke on 7/2/20. +// + +import Cocoa +import SwiftUI + +@NSApplicationMain +class AppDelegate: NSObject, NSApplicationDelegate { + + var window: NSWindow! + + func applicationDidFinishLaunching(_ aNotification: Notification) { + // Create the SwiftUI view that provides the window contents. + let contentView = ContentView() + + // Create the window and set the content view. + window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 480, height: 300), + styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], + backing: .buffered, defer: false) + window.isReleasedWhenClosed = false + window.center() + window.setFrameAutosaveName("Main Window") + window.contentView = NSHostingView(rootView: contentView) + window.makeKeyAndOrderFront(nil) + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } + +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..3f00db4 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard new file mode 100644 index 0000000..ad2fe7b --- /dev/null +++ b/Mac Utils/WKRRaceLiveViewer/WKRRaceLiveViewer/Base.lproj/Main.storyboard @@ -0,0 +1,683 @@ + + + + + + + + + + +