├── .gitignore ├── screenshots ├── app-1.png ├── app-2.png ├── app-3.png ├── icon.png ├── kr-5_8.png ├── lobby.png ├── na-5_9.png ├── nginx.png ├── server.png ├── switch.png └── error-unspecified.png ├── Podfile ├── LoLKR ├── Images.xcassets │ └── AppIcon.appiconset │ │ ├── icon_128x128.png │ │ ├── icon_16x16.png │ │ ├── icon_256x256.png │ │ ├── icon_32x32-1.png │ │ ├── icon_32x32.png │ │ ├── icon_512x512.png │ │ ├── icon_256x256-1.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512-1.png │ │ ├── icon_512x512@2x.png │ │ └── Contents.json ├── ViewController.h ├── main.m ├── ConfigViewController.h ├── AppDelegate.h ├── Credits.rtf ├── ITSwitch.h ├── AppDelegate.m ├── update.sh ├── 2_download_versions.sh ├── ConfigViewController.m ├── Info.plist ├── dsa_pub.pem ├── 1_nginx.sh ├── 3_lol.sh ├── ITSwitch.m ├── ViewController.m └── Main.xib ├── LoLKR.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── LoLKR.xccheckout └── project.pbxproj ├── LoLKR.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── LoLKR.xccheckout ├── LoLKRTests ├── Info.plist └── LoLKRTests.m ├── LICENSE ├── README.md └── updates.xml /.gitignore: -------------------------------------------------------------------------------- 1 | xcuserdata/ 2 | Podfile.lock 3 | Pods/ 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /screenshots/app-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/app-1.png -------------------------------------------------------------------------------- /screenshots/app-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/app-2.png -------------------------------------------------------------------------------- /screenshots/app-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/app-3.png -------------------------------------------------------------------------------- /screenshots/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/icon.png -------------------------------------------------------------------------------- /screenshots/kr-5_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/kr-5_8.png -------------------------------------------------------------------------------- /screenshots/lobby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/lobby.png -------------------------------------------------------------------------------- /screenshots/na-5_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/na-5_9.png -------------------------------------------------------------------------------- /screenshots/nginx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/nginx.png -------------------------------------------------------------------------------- /screenshots/server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/server.png -------------------------------------------------------------------------------- /screenshots/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/switch.png -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :osx, "10.9" 2 | 3 | pod 'PromiseKit', '~> 1.5' 4 | pod 'Sparkle', '~> 1.10' 5 | pod 'HTMLReader' -------------------------------------------------------------------------------- /screenshots/error-unspecified.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/screenshots/error-unspecified.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_128x128.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_16x16.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_256x256.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_32x32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_32x32-1.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_32x32.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_512x512.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_256x256-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_256x256-1.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_32x32@2x.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_512x512-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_512x512-1.png -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mrz1277/LoLKR/HEAD/LoLKR/Images.xcassets/AppIcon.appiconset/icon_512x512@2x.png -------------------------------------------------------------------------------- /LoLKR.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LoLKR/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 3/28/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : NSViewController 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /LoLKR.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /LoLKR/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 3/28/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /LoLKR/ConfigViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ConfigViewController.h 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 4/12/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ConfigViewController : NSViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /LoLKR/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 3/28/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject { 12 | NSWindowController *preferencesWindowController; 13 | } 14 | 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /LoLKR/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg949\cocoartf1347\cocoasubrtf570 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \paperw12240\paperh15840\margl1440\margr1440\vieww9000\viewh8400\viewkind0 5 | \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural 6 | {\field{\*\fldinst{HYPERLINK "https://github.com/mrz1277/LoLKR"}}{\fldrslt 7 | \f0\fs24 \cf0 https://github.com/mrz1277/LoLKR}}} -------------------------------------------------------------------------------- /LoLKR/ITSwitch.h: -------------------------------------------------------------------------------- 1 | // 2 | // ITSwitch.h 3 | // ITSwitch-Demo 4 | // 5 | // Created by Ilija Tovilo on 01/02/14. 6 | // Copyright (c) 2014 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | * ITSwitch is a replica of UISwitch for Mac OS X 13 | */ 14 | IB_DESIGNABLE 15 | @interface ITSwitch : NSControl 16 | 17 | /** 18 | * @property on - Gets or sets the switches state 19 | */ 20 | @property (nonatomic, getter=isOn) IBInspectable BOOL on; 21 | 22 | /** 23 | * @property tintColor - Gets or sets the switches tint 24 | */ 25 | @property (nonatomic, strong) IBInspectable NSColor *tintColor; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /LoLKRTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /LoLKR/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 3/28/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | 13 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 14 | NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 15 | if (![userDefaults objectForKey:@"port1"]) { 16 | [userDefaults setObject:@"8010" forKey:@"port1"]; 17 | } 18 | if (![userDefaults objectForKey:@"port2"]) { 19 | [userDefaults setObject:@"8020" forKey:@"port2"]; 20 | } 21 | if (![userDefaults objectForKey:@"block_update"]) { 22 | [userDefaults setObject:@YES forKey:@"block_update"]; 23 | } 24 | } 25 | 26 | - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { 27 | return YES; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /LoLKRTests/LoLKRTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // LoLKRTests.m 3 | // LoLKRTests 4 | // 5 | // Created by Jaesung Koo on 3/28/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface LoLKRTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation LoLKRTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /LoLKR/update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # update.sh 4 | # LoLKR 5 | # 6 | # Created by Jason Koo on 4/10/15. 7 | # Copyright (c) 2015 Jaesung Koo. All rights reserved. 8 | # 9 | # $> ./update.sh on 8010 8020 "/Application/League of Legends.app" 10 | 11 | # arguments 12 | if [ "$#" -lt 4 ]; then 13 | echo "Illegal number of parameters" 14 | exit 1 15 | fi 16 | 17 | if [ "$1" = "on" ] || [ "$1" = "off" ]; then 18 | echo "" 19 | else 20 | echo "첫번째 전달인자는 on 또는 off 입니다." 21 | exit 1 22 | fi 23 | 24 | if [ ! -d "$4" ]; then 25 | echo "롤 설치 경로를 확인해 주세요." 26 | exit 1 27 | fi 28 | 29 | # 30 | if [ "$1" = "on" ]; then 31 | sh "$5" 32 | echo "DownloadPath = /releases/Maclive 33 | DownloadURL = 127.0.0.1:$3 34 | Region = KR" > "$4/Contents/LoL/RADS/system/system.cfg" 35 | echo "업데이트를 허용 하였습니다. 롤을 다시 시작해서 업데이트를 진행하세요. 업데이트가 끝나면 다시 업데이트 방지로 변경해주세요." 36 | fi 37 | 38 | if [ "$1" = "off" ]; then 39 | echo "DownloadPath = /releases/Maclive 40 | DownloadURL = 127.0.0.1:$2 41 | Region = KR" > "$4/Contents/LoL/RADS/system/system.cfg" 42 | echo "자동 업데이트가 정상적으로 차단되었습니다. 한국 서버가 업데이트가 될때까지 이 상태로 두시면 됩니다." 43 | fi -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Jaesung Koo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /LoLKR/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "icon_16x16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "icon_32x32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "icon_32x32-1.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "icon_32x32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "icon_128x128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "icon_256x256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "icon_256x256-1.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "icon_512x512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "icon_512x512-1.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "icon_512x512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /LoLKR.xcworkspace/xcshareddata/LoLKR.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 3FA5B92B-5DE3-4AB0-B75A-8801D37BFA84 9 | IDESourceControlProjectName 10 | LoLKR 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 14 | https://bitbucket.org/mrz1277/lolkr.git 15 | 16 | IDESourceControlProjectPath 17 | LoLKR.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 21 | .. 22 | 23 | IDESourceControlProjectURL 24 | https://bitbucket.org/mrz1277/lolkr.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 36 | IDESourceControlWCCName 37 | lolkr 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /LoLKR.xcodeproj/project.xcworkspace/xcshareddata/LoLKR.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 379696B1-C478-4816-BBAC-40072FFA148B 9 | IDESourceControlProjectName 10 | LoLKR 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 14 | https://bitbucket.org/mrz1277/lolkr.git 15 | 16 | IDESourceControlProjectPath 17 | LoLKR.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://bitbucket.org/mrz1277/lolkr.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 61DD4E44FCC89B520E1A9129C3FAEB32DB92CE8D 36 | IDESourceControlWCCName 37 | lolkr 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /LoLKR/2_download_versions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 2_download_versions.sh 4 | # LoLKR 5 | # 6 | # Created by Jason Koo on 4/9/15. 7 | # Copyright (c) 2015 Jaesung Koo. All rights reserved. 8 | # 9 | # $> ./2_download_versions.sh 10 | 11 | # nginx home folder check 12 | if [ ! -d "/usr/local/var/www" ]; then 13 | echo "nginx 홈 폴더(/usr/local/var/www)가 존재하지 않습니다." 14 | exit 2 15 | fi 16 | 17 | # check folder structures 18 | cd /usr/local/var/www 19 | if [ ! -d "/usr/local/var/www/releases/Maclive" ]; then 20 | mkdir -p releases/Maclive && cd releases/Maclive 21 | mkdir -p projects/lol_air_client/releases 22 | mkdir -p projects/lol_air_client_config_kr/releases 23 | mkdir -p projects/lol_launcher/releases 24 | mkdir -p projects/lol_patcher/releases 25 | mkdir -p solutions/lol_game_client_sln/releases 26 | mkdir -p system 27 | fi 28 | 29 | # download files 30 | cd /usr/local/var/www/releases/Maclive 31 | BASE_URL="http://l3cdn.riotgames.com/releases/Maclive" 32 | curl -o solutions/lol_game_client_sln/releases/releaselisting_KR $BASE_URL/solutions/lol_game_client_sln/releases/releaselisting_OC1 33 | curl -o projects/lol_air_client/releases/releaselisting_KR $BASE_URL/projects/lol_air_client/releases/releaselisting_OC1 34 | curl -o projects/lol_air_client_config_kr/releases/releaselisting_KR $BASE_URL/projects/lol_air_client_config_oc1/releases/releaselisting_OC1 35 | curl -o projects/lol_launcher/releases/releaselisting_KR $BASE_URL/projects/lol_launcher/releases/releaselisting_OC1 36 | curl -o projects/lol_patcher/releases/releaselisting_KR $BASE_URL/projects/lol_patcher/releases/releaselisting_OC1 37 | curl -o system/filelist.versioninfo $BASE_URL/system/filelist.versioninfo -------------------------------------------------------------------------------- /LoLKR/ConfigViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ConfigViewController.m 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 4/12/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import "ConfigViewController.h" 10 | 11 | @interface ConfigViewController () 12 | @property (weak) IBOutlet NSButtonCell *nginxInstall; 13 | @property (weak) IBOutlet NSPathControl *pathControl; 14 | @property (weak) IBOutlet NSTextField *port1TextField; 15 | @property (weak) IBOutlet NSTextField *port2TextField; 16 | 17 | @end 18 | 19 | @implementation ConfigViewController 20 | 21 | - (IBAction)done:(id)sender { 22 | NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 23 | 24 | if ([self.port1TextField.stringValue length] > 0) { 25 | [userDefaults setObject:self.port1TextField.stringValue forKey:@"port1"]; 26 | } 27 | if ([self.port2TextField.stringValue length] > 0) { 28 | [userDefaults setObject:self.port2TextField.stringValue forKey:@"port2"]; 29 | } 30 | [userDefaults setObject:[NSString stringWithFormat:@"\"%@\"", [NSString stringWithCString:self.pathControl.URL.fileSystemRepresentation encoding:NSUTF8StringEncoding]] forKey:@"lol_path"]; 31 | 32 | [[NSNotificationCenter defaultCenter] postNotificationName:@"runAllScript" object:nil userInfo:@{@"install_nginx": [NSNumber numberWithBool:(self.nginxInstall.state != 0)]}]; 33 | 34 | [self closeSheet:nil]; 35 | } 36 | 37 | - (IBAction)closeSheet:(id)sender { 38 | NSWindow *window = self.view.window; 39 | [[window sheetParent] endSheet:window]; 40 | } 41 | 42 | - (BOOL)validateCheck { 43 | if ((self.port1TextField.stringValue && [self.port1TextField.stringValue intValue] <= 1024) 44 | || (self.port2TextField.stringValue && [self.port2TextField.stringValue intValue] <= 1024)) { 45 | return YES; 46 | } else { 47 | return NO; 48 | } 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /LoLKR/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.4.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 12 25 | LSApplicationCategoryType 26 | public.app-category.utilities 27 | LSMinimumSystemVersion 28 | $(MACOSX_DEPLOYMENT_TARGET) 29 | NSAppTransportSecurity 30 | 31 | NSExceptionDomains 32 | 33 | leagueoflegends.com 34 | 35 | NSIncludesSubdomains 36 | 37 | NSTemporaryExceptionAllowsInsecureHTTPLoads 38 | 39 | 40 | www.leagueoflegends.co.kr 41 | 42 | NSIncludesSubdomains 43 | 44 | NSTemporaryExceptionAllowsInsecureHTTPLoads 45 | 46 | 47 | 48 | 49 | NSHumanReadableCopyright 50 | Copyright © 2015 Jaesung Koo. All rights reserved. 51 | NSMainNibFile 52 | Main 53 | NSPrincipalClass 54 | NSApplication 55 | SUFeedURL 56 | https://raw.githubusercontent.com/mrz1277/LoLKR/master/updates.xml 57 | SUPublicDSAKeyFile 58 | dsa_pub.pem 59 | 60 | 61 | -------------------------------------------------------------------------------- /LoLKR/dsa_pub.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIGOjCCBC0GByqGSM44BAEwggQgAoICAQDYXvkeM6D6WtHEJGucdQaUop81VJTH 3 | A2VxnPyOTiB88aR3GoWxUqE7K8cHpKvMLlckwS+GTyvjqGtqmPNm5IlJucZeZEFB 4 | bcaaQVkMWsLpC48EHF5wxHvdO5vAYXMrTN68duH31xApRAgqZs078g5HEUVmrLCk 5 | 66s1mpPOQdI1BA3qMH7IPBq/wsp2flgMquj50PtUUec/vl/rhBqpWvpXjT82zvG/ 6 | 19admgYpcegvbPVZY8/NsdKxtSfXGoaVp6HJLRDOqhO4lhWYU+vrOVupgXZ2Qv3w 7 | hJADTdc/mKlNohjfQYqV7C6Byaxfo/G+vJTJmFLVlWZxo8u+ThRbYC4ldcNVc4dM 8 | FKt+DIXTwUeiT7fEa38J/bs2VGDeBBl+il38ofel8r0T4ZesD6HK7DaPLDzVhNRH 9 | x3CWyV+yHdrTFVRZ4vmovPWqixWsvDKktYU4o5J85N6S6YVDzVa/x8pKbcPBV2a0 10 | lW+GNDv29pWrkc3YdT9sYVycZ953rO7lEQsIXsoJL5UnwTv0GDMVSgXZg0o4vC6s 11 | SECjmL4DXbpeECi9cYv6DChf0plWmfSx/JEeRXkVZ8h54rGQrHGbkGplcCsJbwyW 12 | u3Sa9YytJ2TR+R1lJQOCZI0OK663dZegkYDnCt2p1dwC95vEeI9a0XOzSwXJZaSS 13 | iaOnie30OXc3QwIVANs/+w40xrqWfS1/Twgp0zkhCAnTAoICAG0gXboJiJWUUmzb 14 | 9hEk3LIcHaEaj3deolkuHkpOevhVOblaZCJHHRp00DNImLERzLGEB8eIkJNfizlb 15 | KqNCHdFk7AdTG4jag9fN6/i54z+GwKAHQmIA6B9Ni43goR68WGQwwmgdp58TnwPh 16 | uLR3lt2b9Ug4ulMXlFQynk+wnIqbdvXflXKdw1at7KWE44ng9m+qd3tSAOdFRGSs 17 | 0JAOeiTmNoRpreZ0KMzQEf0vinC++aa0hkJXdn0ijkP/cRQCrpQfGQTOSz04YRda 18 | SsYbyDktUQkb0O/544Q/2bRe9tIsP4iBywmddkVKkPLwbT7RQR6aCl6jvQTCWakY 19 | RU83rlr+Wz16ZNBZF/5QVNwtcCuCLK3vNebrbBxN86499N4vMTXl6LQncT784Dgl 20 | Uxq/kOiVI67AtHfyXo8CeETl4euS75P8XAbf2JGcvGjFxBr8f4CwmeyI2NpaLLxG 21 | AYzs0P8bNUHa5COFgpewwzdzTD1Np2iHtLzwq67rIkDqx3+YtYqG+uvcuAi3Qew3 22 | fMDFS3bvwZH6bTrnR9RPSVn9YoVqze1PrF/ZXB+empLrNWtIs73FmAwbkG1UYlkn 23 | XSXMO2iXPH2wwPPZ6DdAstcwNCqe61HBMpM1z7PjD8D92oLecpoCeT7/hKVWqz7q 24 | JVB3MdEXpOM0nMyXAocRqtBFl2O1A4ICBQACggIAeYleNi87OOaXdr/WcHnIlRMG 25 | mXYZ6kx605lh63lbgwGxTXj+OIN8laN7zIOauUSGSxVQWptWhhc6/QVI4e243UsB 26 | taF1j1vSWdcNAzaRgC0It8V5WpaMWDLQStPEZx+OJrdF6wBVDcVdxdef2BxqWPrP 27 | CGZApKD4spRIFWs7tjngYPp/XmCqUAEWUAWpqGmObnLKduUmZIqBOgMPVNhMQcQV 28 | L2rL98w5oFk37hnZ65PqPJkv1k4+4X3G7li0BTDACEU+YuRvlSNPr+zc7V8opa5D 29 | Na8U3og5Soa9Ei3Yr6WDWbk+/x3Bo69KR63lrD2/AJQ+chAQ37RoBdgi2+IkV+Oy 30 | 5+Ma4c7ZyChwKAVTPOo+CnaeqZuNYQFksXeAWSjEoDwUXvGKLAKd3SUUPN+5SwCE 31 | LHa5sS3vzpyRcAmzNmZL4y+PZn2gyYlhL43teMQuIfCyBGWA/WV8pjN72RelP9bm 32 | ynpqTjwv9rULnDOzsX9sjSKv6SPcF/dL2+3FU99MGbV6RMms+XKX/3Jhz9qXZIym 33 | cpXMGnGCy/Bz0B7oHUeDy+dL1sx2626fOk4rzZ2fBufZV4gwjOY7rcwhzHh2lVTl 34 | +upYYBWeVBSn+KEyy/JkZuFpmIZhvPIsopHqgY0mailgGlAd9A1cKDPMHYqYvrT+ 35 | IZtDNuRZMxNNxkLjSAo= 36 | -----END PUBLIC KEY----- 37 | -------------------------------------------------------------------------------- /LoLKR/1_nginx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 1_nginx.sh 4 | # LoLKR 5 | # 6 | # Created by Jason Koo on 4/9/15. 7 | # Copyright (c) 2015 Jaesung Koo. All rights reserved. 8 | # 9 | # $> ./1_nginx.sh 8010 8020 10 | 11 | # arguments 12 | if [ "$#" -ne 2 ]; then 13 | echo "Illegal number of parameters" 14 | exit 1 15 | fi 16 | 17 | # install 18 | if type /usr/local/bin/brew 2>/dev/null; then 19 | /usr/local/bin/brew update && /usr/local/bin/brew install nginx 20 | else 21 | echo "터미널에 다음 커맨드를 복사해서 brew를 먼저 설치해주세요. ruby -e \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"" 22 | exit 1 23 | fi 24 | 25 | # exceptions 26 | if ! type /usr/local/bin/nginx 2>/dev/null; then 27 | echo "nginx가 설치되지 않았습니다." 28 | exit 1 29 | fi 30 | 31 | if [ ! -d "/usr/local/etc/nginx/" ]; then 32 | echo "nginx 설정 폴더(/usr/local/etc/nginx/)가 없습니다." 33 | exit 1 34 | fi 35 | 36 | # configuration 37 | echo " 38 | worker_processes 1; 39 | 40 | events { 41 | worker_connections 1024; 42 | } 43 | 44 | http { 45 | include mime.types; 46 | default_type text/plain; 47 | 48 | # disable auto-update 49 | server { 50 | listen $1; 51 | server_name localhost; 52 | 53 | location / { 54 | root html; 55 | try_files \$uri \$uri/ @cdn; 56 | } 57 | 58 | location @cdn { 59 | proxy_pass http://l3cdn.riotgames.com; 60 | proxy_connect_timeout 60s; 61 | proxy_read_timeout 60s; 62 | } 63 | } 64 | 65 | # enable auto-update 66 | server { 67 | listen $2; 68 | server_name localhost; 69 | 70 | rewrite ^(.*)_KR\$ \$1_OC1; 71 | rewrite ^(.*)_ko_kr/(((?!files|releasemanifest).)*)\$ \$1_en_au/\$2; 72 | rewrite ^(.*)_kr/(((?!files|releasemanifest).)*)\$ \$1_oc1/\$2; 73 | 74 | location / { 75 | proxy_pass http://l3cdn.riotgames.com; 76 | proxy_connect_timeout 60s; 77 | proxy_read_timeout 60s; 78 | } 79 | } 80 | } 81 | " > /usr/local/etc/nginx/nginx.conf 82 | 83 | # start item 84 | if [ ! -d ~/Library/LaunchAgents ]; then 85 | mkdir ~/Library/LaunchAgents 86 | fi 87 | ln -sf /usr/local/opt/nginx/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/ 88 | 89 | # run 90 | if ps ax | grep -v grep | grep -v 1_nginx | grep nginx > /dev/null; then 91 | /usr/local/bin/nginx -s reload 92 | else 93 | /usr/local/bin/nginx 94 | fi 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 맥 공식 어플리케이션 출시 2 | 3 | http://www.leagueoflegends.co.kr/?m=download&mod=client_mac 4 | 5 | --- 6 | 7 | **_이 프로젝트는 더 이상 유지되지 않습니다._** 8 | 9 | 업데이트는 LoLKR 실행하고 상단 메뉴바의 `롤 한국 서버 패치` 메뉴를 누르고 `업데이트 확인`을 누르시면 됩니다. 10 | 11 | * 2016-03-13 : (v1.4.0) 6.5 패치 대응. 오세아니아로 기본 서버 변경. 12 | * 2015-09-01 : (v1.3.3) 로비 화면 UI 업데이트 [@billieyang](https://github.com/billieyang)님 제공 13 | * 2015-07-22 : (v1.3.0) 부팅때 nginx가 켜지지 않는 문제, 패치 때마다 한국어 음성이 나오지 않는 문제 해결 14 | * 2015-05-15 : (v1.2.3) 북미 및 한국 서버 버전 확인 15 | * 2015-05-01 : (v1.2.2) 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다. 16 | * 2015-04-21 : (v1.2.0) 10.9(Mavericks)에서 창이 안뜨는 문제 해결 17 | * 2015-04-17 : (v1.1.0) 자체 업데이트 지원 18 | * 2015-04-14 : (v1.0.0) 배포 19 | 20 | # 시작 전 주의사항 21 | 22 | 본 프로그램은 한국 서버가 업데이트 되기전에 **미리** 패치해놓고 있어야 북미와 버전 차이가 나는 업데이트 기간 동안 정상적으로 접속이 가능합니다. 예를 들어 현재 한국 서버 버전은 아직 5.8인데 롤을 실행하여 5.9로 업데이트 되었다면 아래 앱을 설치한다고 해서 다시 5.8로 접속할 수는 없습니다. 즉 본 프로그램으로 미리 패치해서 업데이트 방지로 걸려있지 않는한 북미 업데이트 기간에 접속이 안된다고 질문글 올리셔도 방법이 없습니다. 23 | 24 | # 사용법 25 | 26 | ## 1. 오세아니아 롤 설치 27 | 28 | 더이상 북미 버전을 사용하지 않습니다. 아래 링크에서 오세아니아 서버 롤을 설치합니다. https://signup.oce.leagueoflegends.com/en/signup/redownload 29 | 30 | ## 2. [brew](http://brew.sh/) 설치 31 | 32 | 먼저 `brew`(OS X 패키지 관리자)가 설치 안되어 있으신 분들은 설치해 주셔야 합니다. 33 | ``` 34 | ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 35 | ``` 36 | 터미널에 위 명령어를 복사하시고 붙여넣기해서 실행해 주시면 설치가 진행됩니다. 설치 중간에 `/usr/local` 폴더 생성을 위해 맥북 관리자 비밀번호를 한번 요구합니다. 비밀번호 입력할 때 `password:` 다음 커서가 멈춰있는것처럼 보이는데 실제로는 비밀번호를 받고 있는 상태이니 그냥 비밀번호를 치고 엔터키를 누르시면 됩니다. 37 | 38 | ## 3. 앱 [다운로드](https://github.com/mrz1277/LoLKR/releases/download/latest/LoLKR.zip) 39 | ![앱 구동 화면](https://raw.githubusercontent.com/mrz1277/LoLKR/master/screenshots/app-1.png) 40 | 41 | '패치 하기' 버튼을 눌러주세요. 42 | 43 | ## 4. 패치 준비 44 | ![설정화면](https://raw.githubusercontent.com/mrz1277/LoLKR/master/screenshots/app-2.png) 45 | 46 | 대부분은 그냥 확인 버튼을 누르시면 됩니다. 자세한 옵션 설정은 [이곳](https://github.com/mrz1277/LoLKR/wiki/Install-options)을 참조해 주세요. 47 | 48 | 패치가 완료되면 롤을 다시 시작해주세요. 49 | 50 | ![완료 화면](https://raw.githubusercontent.com/mrz1277/LoLKR/master/screenshots/app-3.png) 51 | 52 | 패치는 최초 한번만 하시면 됩니다. 여기서 주의하실 점은 **롤 업데이트 기간동안 패치하기를 하면 안되는 것입니다.** 패치하기를 진행하면 자동으로 최신 버전의 업데이트 파일들을 내려받기 때문에 롤을 실행하게 되면 오세아니아 서버 기준으로 업데이트가 진행됩니다. 업데이트 기간동안엔 아래의 스위치 조작을 하시면 됩니다. 53 | 54 | ## 5. 업데이트 스위치 55 | ![스위치](https://raw.githubusercontent.com/mrz1277/LoLKR/master/screenshots/switch.png) 56 | 57 | 평소 자동 업데이트 방지에 스위치를 켜두고 있다가, 한국 서버가 정상적으로 업데이트 되면 그때 스위치를 잠시 끄고 롤을 실행하면 클라이언트가 정상적으로 업데이트됩니다. 업데이트가 완료되면 다시 스위치를 켜고 자동 업데이트 방지에 두고 플레이 하시면 됩니다. 58 | 59 | # 자주 묻는 질문 60 | 61 | [이곳](https://github.com/mrz1277/LoLKR/issues?q=is%3Aissue+is%3Aclosed)에서 기존에 다른 유저들이 올린 문제에 대한 부분을 먼저 검색해주세요. 62 | 63 | ### *명시되지 않은 오류가 발생했다며 롤이 실행되지 않습니다.* 64 | 65 | ![명시되지 않은 에러](https://raw.githubusercontent.com/mrz1277/LoLKR/master/screenshots/error-unspecified.png) 66 | 67 | `nginx`가 제대로 실행되고 있는지 확인해 주세요. `LoLKR` 앱을 켰을때 nginx 부분이 회색이면 실행되고 있지 않다는 뜻입니다. 68 | 69 | ![nginx](https://raw.githubusercontent.com/mrz1277/LoLKR/master/screenshots/nginx.png) 70 | 71 | 터미널에서 아래 커맨드를 입력해서 실행시켜주세요. 72 | 73 | ``` 74 | nginx 75 | ``` 76 | 77 | nginx 가 이미 실행중일때 재시작하는 커맨드: 78 | 79 | ``` 80 | nginx -s reload 81 | ``` 82 | 83 | ### *`brew`를 이용한 `nginx` 설치가 잘 안됩니다.* 84 | 85 | 기존에 설치된 프로그램들과 충돌이 있는 경우가 있습니다. 터미널에 아래 커맨드를 입력해서 문제점을 진단해보세요. 86 | 87 | ``` 88 | brew doctor 89 | ``` 90 | 91 | ### *업데이트 기간중에 패치가 되어버렸습니다. 다시 되돌릴 수 없나요?* 92 | 93 | 로컬에 웹서버를 둔 이상 로컬 메타파일이 업데이트 되면 다시 되돌리긴 어렵습니다. 그게 온라인상에 업데이트 서버가 있어야 하는 이유입니다. 94 | 95 | ### *다른 문제가 생겼어요.* 96 | 97 | [이슈](https://github.com/mrz1277/LoLKR/issues)에 올려주세요. `closed` 탭에 들어가면 기존에 질문했던 내역들도 볼 수 있으니 올리기 전에 미리 검색해 보시면 도움이 됩니다. *개인 이메일로 직접 문의는 받지 않습니다.* 98 | 99 | # 패치 삭제하기 100 | 101 | 이전으로 복원하는 가장 깔끔한 방법은 롤을 재설치 하는겁니다. 102 | 103 | 1. 기존에 설치된 롤을 `/Application` 폴더에서 삭제합니다. 104 | 2. 터미널에 아래 커맨드를 입력해 `nginx`를 삭제합니다. 105 | ``` 106 | brew uninstall nginx 107 | ``` 108 | 109 | 3. [북미 공식 홈](http://na.leagueoflegends.com/)에서 롤을 다운받아 설치합니다. 110 | 111 | # 지원 OS 버전 112 | 113 | OS X 10.9(Mavericks) 이상 114 | -------------------------------------------------------------------------------- /LoLKR/3_lol.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 3_lol.sh 4 | # LoLKR 5 | # 6 | # Created by Jason Koo on 4/9/15. 7 | # Copyright (c) 2015 Jaesung Koo. All rights reserved. 8 | # 9 | # $> ./3_lol.sh "/Applications/League of Legends.app" 8010 10 | 11 | # arguments 12 | if [ "$#" -ne 2 ]; then 13 | echo "Illegal number of parameters" 14 | exit 3 15 | fi 16 | 17 | if [ ! -d "$1" ]; then 18 | echo "롤 설치 경로를 확인해 주세요." 19 | exit 3 20 | fi 21 | 22 | BASE_DIR="$1/Contents/LoL/RADS" 23 | 24 | # add korea server on menu 25 | echo "na, na, en_US, A 26 | br, br, pt_BR, A 27 | tr, tr, tr_TR, A 28 | euw, euw, en_GB|de_DE|es_ES|fr_FR|it_IT, A 29 | eune, eune, en_GB|cs_CZ|el_GR|hu_HU|pl_PL|ro_RO, A 30 | ru, ru, ru_RU, A 31 | la1, la1, es_MX, A 32 | la2, la2, es_MX, A 33 | oc1, oc1, en_AU, A 34 | jp, jp, ja_JP, A 35 | kr, kr, ko_KR|en_US, A 36 | " > $BASE_DIR/projects/lol_patcher/managedfiles/0.0.0.45/regions.txt 37 | 38 | echo "na, NA, lol_air_client_config_na, NA1, prod.na1.lol.riotgames.com, status.leagueoflegends.com 39 | br, BR, lol_air_client_config_br, BR1, prod.br.lol.riotgames.com, status.leagueoflegends.com 40 | tr, TR, lol_air_client_config_tr, TR1, prod.tr.lol.riotgames.com, status.leagueoflegends.com 41 | euw, EUW, lol_air_client_config_euw, EUW1, prod.euw1.lol.riotgames.com, status.leagueoflegends.com 42 | eune, EUNE, lol_air_client_config_eune, EUN1, prod.eun1.lol.riotgames.com, status.leagueoflegends.com 43 | ru, RU, lol_air_client_config_ru, RU, prod.ru.lol.riotgames.com, status.leagueoflegends.com 44 | la1, LA1, lol_air_client_config_la1, LA1, prod.la1.lol.riotgames.com, status.leagueoflegends.com 45 | la2, LA2, lol_air_client_config_la2, LA2, prod.la2.lol.riotgames.com, status.leagueoflegends.com 46 | oc1, OC1, lol_air_client_config_oc1, OC1, prod.oc1.lol.riotgames.com, status.leagueoflegends.com 47 | jp, JP, lol_air_client_config_jp, jp1, prod.jp1.lol.riotgames.com, status.leagueoflegends.com 48 | kr, KR, lol_air_client_config_kr, KR, prod.kr.lol.riotgames.com, status.leagueoflegends.com 49 | " > $BASE_DIR/projects/lol_patcher/managedfiles/0.0.0.45/shards.txt 50 | 51 | echo "English, en_US 52 | Português, pt_BR 53 | Türkçe, tr_TR 54 | English, en_GB 55 | Deutsch, de_DE 56 | Español, es_ES 57 | Français, fr_FR 58 | Italiano, it_IT 59 | Čeština, cs_CZ 60 | Ελληνικά, el_GR 61 | Magyar, hu_HU 62 | Polski, pl_PL 63 | Română, ro_RO 64 | Русский, ru_RU 65 | Español, es_MX 66 | English, en_AU 67 | 日本語, ja_JP 68 | Korean, ko_KR" > $BASE_DIR/projects/lol_patcher/managedfiles/0.0.0.45/languages.txt 69 | 70 | # change update server address 71 | echo "DownloadPath = /releases/Maclive 72 | DownloadURL = 127.0.0.1:$2 73 | Region = KR" > "$BASE_DIR/system/system.cfg" 74 | 75 | # change login server address 76 | if [ ! -d "$BASE_DIR/projects/lol_air_client_config_oc1/releases" ]; then 77 | echo "북미 서버를 먼저 선택하고 업데이트가 완료되어야 합니다." 78 | exit 3 79 | fi 80 | 81 | if [ ! -d "$BASE_DIR/projects/lol_air_client_config_kr" ]; then 82 | cp -r "$BASE_DIR/projects/lol_air_client_config_oc1" "$BASE_DIR/projects/lol_air_client_config_kr" 83 | fi 84 | 85 | find "$BASE_DIR/projects/lol_air_client_config_kr" -name "lol.properties" | while read filename; do echo "host=prod.kr.lol.riotgames.com,prod.kr.lol.riotgames.com 86 | xmpp_server_url=chat.kr.lol.riotgames.com 87 | lq_uri=https://lq.kr.lol.riotgames.com 88 | rssStatusURLs=null 89 | regionTag=kr 90 | lobbyLandingURL=http://frontpage.kr.leagueoflegends.com/ko_KR/client/landing 91 | featuredGamesURL=http://spectator.kr.lol.riotgames.com:80/observer-mode/rest/featured 92 | storyPageURL=http://www.leagueoflegends.co.kr/launcher/journal.php 93 | ladderURL=http://www.leagueoflegends.co.kr 94 | platformId=KR 95 | ekg_uri=https://ekg.riotgames.com 96 | loadModuleChampionDetail=true 97 | useOldChatRenderers=true 98 | riotDataServiceDataSendProbability=1.0" > "$filename"; done 99 | 100 | echo "airConfigProject = lol_air_client_config_kr" > "$BASE_DIR/system/launcher.cfg" 101 | echo "locale = ko_KR" > "$BASE_DIR/system/locale.cfg" 102 | -------------------------------------------------------------------------------- /updates.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 롤 한국 서버 패치 5 | https://raw.githubusercontent.com/mrz1277/LoLKR/master/updates.xml 6 | Most recent changes with links to updates. 7 | kr 8 | 9 | 10 | Version 1.4.0 11 | 12 |
  • 6.5 패치 대응
  • 오세아니아로 기본 서버 변경
  • 14 | ]]> 15 |
    16 | Sun, 13 Mar 2016 15:30:00 +9000 17 | 18 |
    19 | 20 | Version 1.3.3 21 | 22 | 업데이트 이력 24 |

    v1.3.3

    25 |
    • 로비 화면 UI 업데이트
    26 |

    v1.3.2

    27 |
    • 업데이트 허용 버그 수정
    28 |

    v1.3.1

    29 |
    • 버그 수정
    30 |

    v1.3.0

    31 |
    • 부팅때 nginx가 켜지지 않는 문제 해결
    • 패치 때마다 한국어 음성이 나오지 않는 문제 해결
    • 업데이트 기간 경고 메세지 추가
    32 |

    v1.2.3

    33 |
    • 북미 및 한국 서버 버전 확인 가능
    34 |

    v1.2.2

    35 |
    • 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다.
    36 |

    v1.2.1

    37 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    38 |

    v1.2

    39 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    40 | ]]> 41 |
    42 | Tue, 01 Sep 2015 09:00:00 +9000 43 | 44 |
    45 | 46 | Version 1.3.2 47 | 48 | 업데이트 이력 50 |

    v1.3.2

    51 |
    • 업데이트 허용 버그 수정
    52 |

    v1.3.1

    53 |
    • 버그 수정
    54 |

    v1.3.0

    55 |
    • 부팅때 nginx가 켜지지 않는 문제 해결
    • 패치 때마다 한국어 음성이 나오지 않는 문제 해결
    • 업데이트 기간 경고 메세지 추가
    56 |

    v1.2.3

    57 |
    • 북미 및 한국 서버 버전 확인 가능
    58 |

    v1.2.2

    59 |
    • 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다.
    60 |

    v1.2.1

    61 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    62 |

    v1.2

    63 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    64 | ]]> 65 |
    66 | Thu, 23 Jul 2015 12:20:00 +9000 67 | 68 |
    69 | 70 | Version 1.3.1 71 | 72 | 업데이트 이력 74 |

    v1.3.1

    75 |
    • 버그 수정
    76 |

    v1.3.0

    77 |
    • 부팅때 nginx가 켜지지 않는 문제 해결
    • 패치 때마다 한국어 음성이 나오지 않는 문제 해결
    • 업데이트 기간 경고 메세지 추가
    78 |

    v1.2.3

    79 |
    • 북미 및 한국 서버 버전 확인 가능
    80 |

    v1.2.2

    81 |
    • 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다.
    82 |

    v1.2.1

    83 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    84 |

    v1.2

    85 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    86 | ]]> 87 |
    88 | Thu, 23 Jul 2015 02:20:00 +9000 89 | 90 |
    91 | 92 | Version 1.3.0 93 | 94 | 업데이트 이력 96 |

    v1.3.0

    97 |
    • 부팅때 nginx가 켜지지 않는 문제 해결
    • 패치 때마다 한국어 음성이 나오지 않는 문제 해결
    • 업데이트 기간 경고 메세지 추가
    98 |

    v1.2.3

    99 |
    • 북미 및 한국 서버 버전 확인 가능
    100 |

    v1.2.2

    101 |
    • 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다.
    102 |

    v1.2.1

    103 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    104 |

    v1.2

    105 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    106 | ]]> 107 |
    108 | Wed, 22 Jul 2015 12:00:00 +9000 109 | 110 |
    111 | 112 | Version 1.2.3 113 | 114 | 업데이트 이력 116 |

    v1.2.3

    117 |
    • 북미 및 한국 서버 버전 확인 가능
    118 |

    v1.2.2

    119 |
    • 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다.
    120 |

    v1.2.1

    121 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    122 |

    v1.2

    123 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    124 | ]]> 125 |
    126 | Fri, 15 May 2015 22:00:00 +9000 127 | 128 |
    129 | 130 | Version 1.2.2 131 | 132 | 업데이트 이력 134 |

    v1.2.2

    135 |
    • 5.8패치 대응. `패치하기`를 먼저 한번 실행한 다음 업데이트 스위치를 끄면 5.8업데이트가 정상적으로 진행됩니다.
    136 |

    v1.2.1

    137 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    138 |

    v1.2

    139 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    140 | ]]> 141 |
    142 | Fri, 01 May 2015 10:00:00 +9000 143 | 144 |
    145 | 146 | Version 1.2.1 147 | 148 | 업데이트 이력 150 |

    v1.2.1

    151 |
    • 시작아이템 등록 폴더 존재하지 않으면 생성해서 nginx 등록
    152 |

    v1.2

    153 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    154 | ]]> 155 |
    156 | Tue, 21 Apr 2015 11:40:11 +9000 157 | 158 |
    159 | 160 | Version 1.2 161 | 162 | v1.2 164 |
    • OS X 10.9(Mavericks)에서 창이 안뜨는 문제 해결
    165 | ]]> 166 |
    167 | Tue, 21 Apr 2015 05:40:11 +9000 168 | 169 |
    170 |
    171 |
    172 | -------------------------------------------------------------------------------- /LoLKR/ITSwitch.m: -------------------------------------------------------------------------------- 1 | // 2 | // ITSwitch.m 3 | // ITSwitch-Demo 4 | // 5 | // Created by Ilija Tovilo on 01/02/14. 6 | // Copyright (c) 2014 Ilija Tovilo. All rights reserved. 7 | // 8 | 9 | #import "ITSwitch.h" 10 | #import 11 | 12 | 13 | // ---------------------------------------------------- 14 | #pragma mark - Static Constants 15 | // ---------------------------------------------------- 16 | 17 | static NSTimeInterval const kAnimationDuration = 0.4f; 18 | 19 | static CGFloat const kBorderLineWidth = 1.f; 20 | 21 | static CGFloat const kGoldenRatio = 1.61803398875f; 22 | static CGFloat const kDecreasedGoldenRatio = 1.38; 23 | 24 | static CGFloat const kEnabledOpacity = 1.f; 25 | static CGFloat const kDisabledOpacity = 0.5f; 26 | 27 | // ---------------------------------------------------- 28 | #pragma mark - Preprocessor 29 | // ---------------------------------------------------- 30 | 31 | 32 | #define kKnobBackgroundColor [NSColor colorWithCalibratedWhite:1.f alpha:1.f] 33 | 34 | #define kDisabledBorderColor [NSColor colorWithCalibratedWhite:0.f alpha:0.2f] 35 | #define kDisabledBackgroundColor [NSColor clearColor] 36 | #define kDefaultTintColor [NSColor colorWithCalibratedRed:0.27f green:0.86f blue:0.36f alpha:1.f] 37 | #define kInactiveBackgroundColor [NSColor colorWithCalibratedWhite:0 alpha:0.3] 38 | 39 | // --------------------------------------------------------------------------------------- 40 | #pragma mark - Interface Extension 41 | // --------------------------------------------------------------------------------------- 42 | 43 | @interface ITSwitch () { 44 | __weak id _target; 45 | SEL _action; 46 | } 47 | 48 | @property (nonatomic, getter = isActive) BOOL active; 49 | @property (nonatomic, getter = hasDragged) BOOL dragged; 50 | @property (nonatomic, getter = isDraggingTowardsOn) BOOL draggingTowardsOn; 51 | 52 | @property (nonatomic, readonly, strong) CALayer *rootLayer; 53 | @property (nonatomic, readonly, strong) CALayer *backgroundLayer; 54 | @property (nonatomic, readonly, strong) CALayer *knobLayer; 55 | @property (nonatomic, readonly, strong) CALayer *knobInsideLayer; 56 | 57 | @end 58 | 59 | 60 | 61 | // --------------------------------------------------------------------------------------- 62 | #pragma mark - ITSwitch 63 | // --------------------------------------------------------------------------------------- 64 | 65 | @implementation ITSwitch 66 | @synthesize tintColor = _tintColor; 67 | 68 | 69 | 70 | // ---------------------------------------------------- 71 | #pragma mark - Init 72 | // ---------------------------------------------------- 73 | 74 | - (id)initWithCoder:(NSCoder *)coder { 75 | self = [super initWithCoder:coder]; 76 | if (!self) return nil; 77 | 78 | [self setUp]; 79 | 80 | return self; 81 | } 82 | 83 | - (id)initWithFrame:(NSRect)frame { 84 | self = [super initWithFrame:frame]; 85 | if (!self) return nil; 86 | 87 | [self setUp]; 88 | 89 | return self; 90 | } 91 | 92 | - (void)setUp { 93 | // The Switch is enabled per default 94 | self.enabled = YES; 95 | 96 | // Set up the layer hierarchy 97 | [self setUpLayers]; 98 | } 99 | 100 | - (void)setUpLayers { 101 | // Root layer 102 | _rootLayer = [CALayer layer]; 103 | //_rootLayer.delegate = self; 104 | self.layer = _rootLayer; 105 | self.wantsLayer = YES; 106 | 107 | // Background layer 108 | _backgroundLayer = [CALayer layer]; 109 | _backgroundLayer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 110 | _backgroundLayer.bounds = _rootLayer.bounds; 111 | _backgroundLayer.anchorPoint = (CGPoint){ .x = 0.f, .y = 0.f }; 112 | _backgroundLayer.borderWidth = kBorderLineWidth; 113 | [_rootLayer addSublayer:_backgroundLayer]; 114 | 115 | // Knob layer 116 | _knobLayer = [CALayer layer]; 117 | _knobLayer.frame = [self rectForKnob]; 118 | _knobLayer.autoresizingMask = kCALayerHeightSizable; 119 | _knobLayer.backgroundColor = [kKnobBackgroundColor CGColor]; 120 | _knobLayer.shadowColor = [[NSColor blackColor] CGColor]; 121 | _knobLayer.shadowOffset = (CGSize){ .width = 0.f, .height = -2.f }; 122 | _knobLayer.shadowRadius = 1.f; 123 | _knobLayer.shadowOpacity = 0.3f; 124 | [_rootLayer addSublayer:_knobLayer]; 125 | 126 | _knobInsideLayer = [CALayer layer]; 127 | _knobInsideLayer.frame = _knobLayer.bounds; 128 | _knobInsideLayer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 129 | _knobInsideLayer.shadowColor = [[NSColor blackColor] CGColor]; 130 | _knobInsideLayer.shadowOffset = (CGSize){ .width = 0.f, .height = 0.f }; 131 | _knobInsideLayer.backgroundColor = [[NSColor whiteColor] CGColor]; 132 | _knobInsideLayer.shadowRadius = 1.f; 133 | _knobInsideLayer.shadowOpacity = 0.35f; 134 | [_knobLayer addSublayer:_knobInsideLayer]; 135 | 136 | // Initial 137 | [self reloadLayerSize]; 138 | [self reloadLayer]; 139 | } 140 | 141 | 142 | 143 | // ---------------------------------------------------- 144 | #pragma mark - NSView 145 | // ---------------------------------------------------- 146 | 147 | - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { 148 | return YES; 149 | } 150 | 151 | - (void)setFrame:(NSRect)frameRect { 152 | [super setFrame:frameRect]; 153 | 154 | [self reloadLayerSize]; 155 | } 156 | 157 | - (void)drawFocusRingMask { 158 | CGFloat cornerRadius = NSHeight([self bounds])/2.0; 159 | NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerRadius yRadius:cornerRadius]; 160 | [[NSColor blackColor] set]; 161 | [path fill]; 162 | } 163 | 164 | - (BOOL)canBecomeKeyView { 165 | return [NSApp isFullKeyboardAccessEnabled]; 166 | } 167 | 168 | - (NSRect)focusRingMaskBounds { 169 | return [self bounds]; 170 | } 171 | 172 | 173 | // ---------------------------------------------------- 174 | #pragma mark - Update Layer 175 | // ---------------------------------------------------- 176 | 177 | - (void)reloadLayer { 178 | [CATransaction begin]; 179 | [CATransaction setAnimationDuration:kAnimationDuration]; 180 | { 181 | // ------------------------------- Animate Border 182 | // The green part also animates, which looks kinda weird 183 | // We'll use the background-color for now 184 | // _backgroundLayer.borderWidth = (YES || self.isActive || self.isOn) ? NSHeight(_backgroundLayer.bounds) / 2 : kBorderLineWidth; 185 | 186 | // ------------------------------- Animate Colors 187 | if (([self hasDragged] && [self isDraggingTowardsOn]) || (![self hasDragged] && [self isOn])) { 188 | _backgroundLayer.borderColor = [self.tintColor CGColor]; 189 | _backgroundLayer.backgroundColor = [self.tintColor CGColor]; 190 | } else { 191 | _backgroundLayer.borderColor = [kDisabledBorderColor CGColor]; 192 | _backgroundLayer.backgroundColor = [kDisabledBackgroundColor CGColor]; 193 | } 194 | 195 | // ------------------------------- Animate Enabled-Disabled state 196 | _rootLayer.opacity = (self.isEnabled) ? kEnabledOpacity : kDisabledOpacity; 197 | 198 | // ------------------------------- Animate Frame 199 | if (![self hasDragged]) { 200 | CAMediaTimingFunction *function = [CAMediaTimingFunction functionWithControlPoints:0.25f :1.5f :0.5f :1.f]; 201 | [CATransaction setAnimationTimingFunction:function]; 202 | } 203 | 204 | self.knobLayer.frame = [self rectForKnob]; 205 | self.knobInsideLayer.frame = self.knobLayer.bounds; 206 | } 207 | [CATransaction commit]; 208 | } 209 | 210 | - (void)reloadLayerSize { 211 | [CATransaction begin]; 212 | [CATransaction setDisableActions:YES]; 213 | { 214 | self.knobLayer.frame = [self rectForKnob]; 215 | self.knobInsideLayer.frame = self.knobLayer.bounds; 216 | 217 | [_backgroundLayer setCornerRadius:_backgroundLayer.bounds.size.height / 2.f]; 218 | [_knobLayer setCornerRadius:_knobLayer.bounds.size.height / 2.f]; 219 | [_knobInsideLayer setCornerRadius:_knobLayer.bounds.size.height / 2.f]; 220 | } 221 | [CATransaction commit]; 222 | } 223 | 224 | - (CGFloat)knobHeightForSize:(NSSize)size 225 | { 226 | return size.height - (kBorderLineWidth * 2.f); 227 | } 228 | 229 | - (CGRect)rectForKnob { 230 | CGFloat height = [self knobHeightForSize:_backgroundLayer.bounds.size]; 231 | CGFloat width = ![self isActive] ? (NSWidth(_backgroundLayer.bounds) - 2.f * kBorderLineWidth) * 1.f / kGoldenRatio : 232 | (NSWidth(_backgroundLayer.bounds) - 2.f * kBorderLineWidth) * 1.f / kDecreasedGoldenRatio; 233 | CGFloat x = ((![self hasDragged] && ![self isOn]) || (self.hasDragged && ![self isDraggingTowardsOn])) ? 234 | kBorderLineWidth : 235 | NSWidth(_backgroundLayer.bounds) - width - kBorderLineWidth; 236 | 237 | return (CGRect) { 238 | .size.width = width, 239 | .size.height = height, 240 | .origin.x = x, 241 | .origin.y = kBorderLineWidth, 242 | }; 243 | } 244 | 245 | 246 | 247 | // ---------------------------------------------------- 248 | #pragma mark - NSResponder 249 | // ---------------------------------------------------- 250 | 251 | - (BOOL)acceptsFirstResponder { 252 | return [NSApp isFullKeyboardAccessEnabled]; 253 | } 254 | 255 | - (void)mouseDown:(NSEvent *)theEvent { 256 | if (!self.isEnabled) return; 257 | 258 | self.active = YES; 259 | 260 | [self reloadLayer]; 261 | } 262 | 263 | - (void)mouseDragged:(NSEvent *)theEvent { 264 | if (!self.isEnabled) return; 265 | 266 | self.dragged = YES; 267 | 268 | NSPoint draggingPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil]; 269 | self.draggingTowardsOn = draggingPoint.x >= NSWidth(self.bounds) / 2.f; 270 | 271 | [self reloadLayer]; 272 | } 273 | 274 | - (void)mouseUp:(NSEvent *)theEvent { 275 | if (!self.isEnabled) return; 276 | 277 | self.active = NO; 278 | 279 | BOOL isOn = (![self hasDragged]) ? ![self isOn] : [self isDraggingTowardsOn]; 280 | BOOL invokeTargetAction = (isOn != [self isOn]); 281 | 282 | self.on = isOn; 283 | if (invokeTargetAction) [self _invokeTargetAction]; 284 | 285 | // Reset 286 | self.dragged = NO; 287 | self.draggingTowardsOn = NO; 288 | 289 | [self reloadLayer]; 290 | } 291 | 292 | - (void)moveLeft:(id)sender { 293 | if ([self isOn]) { 294 | self.on = NO; 295 | [self _invokeTargetAction]; 296 | } 297 | } 298 | 299 | - (void)moveRight:(id)sender { 300 | if ([self isOn] == NO) { 301 | self.on = YES; 302 | [self _invokeTargetAction]; 303 | } 304 | } 305 | 306 | - (BOOL)performKeyEquivalent:(NSEvent *)theEvent { 307 | BOOL handledKeyEquivalent = NO; 308 | if ([[self window] firstResponder] == self) { 309 | NSInteger ch = [theEvent keyCode]; 310 | 311 | if (ch == 49) //Space 312 | { 313 | self.on = ![self isOn]; 314 | [self _invokeTargetAction]; 315 | handledKeyEquivalent = YES; 316 | } 317 | } 318 | return handledKeyEquivalent; 319 | } 320 | 321 | 322 | // ---------------------------------------------------- 323 | #pragma mark - Accessors 324 | // ---------------------------------------------------- 325 | 326 | - (id)target { 327 | return _target; 328 | } 329 | 330 | - (void)setTarget:(id)target { 331 | _target = target; 332 | } 333 | 334 | - (SEL)action { 335 | return _action; 336 | } 337 | 338 | - (void)setAction:(SEL)action { 339 | _action = action; 340 | } 341 | 342 | - (void)setOn:(BOOL)on { 343 | if (_on != on) { 344 | _on = on; 345 | } 346 | 347 | [self reloadLayer]; 348 | } 349 | 350 | - (NSColor *)tintColor { 351 | if (!_tintColor) return kDefaultTintColor; 352 | 353 | return _tintColor; 354 | } 355 | 356 | - (void)setTintColor:(NSColor *)tintColor { 357 | _tintColor = tintColor; 358 | 359 | [self reloadLayer]; 360 | } 361 | 362 | - (void)setEnabled:(BOOL)enabled { 363 | [super setEnabled:enabled]; 364 | [self reloadLayer]; 365 | } 366 | 367 | // ----------------------------------- 368 | #pragma mark - Helpers 369 | // ----------------------------------- 370 | 371 | - (void)_invokeTargetAction { 372 | if (self.target && self.action) { 373 | NSMethodSignature *signature = [[self.target class] instanceMethodSignatureForSelector:self.action]; 374 | NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 375 | [invocation setTarget:self.target]; 376 | [invocation setSelector:self.action]; 377 | [invocation setArgument:(void *)&self atIndex:2]; 378 | 379 | [invocation invoke]; 380 | } 381 | } 382 | 383 | // ----------------------------------- 384 | #pragma mark - Accessibility 385 | // ----------------------------------- 386 | 387 | - (BOOL)accessibilityIsIgnored { 388 | return NO; 389 | } 390 | 391 | - (id)accessibilityHitTest:(NSPoint)point { 392 | return self; 393 | } 394 | 395 | - (NSArray *)accessibilityAttributeNames { 396 | static NSArray *attributes = nil; 397 | if (attributes == nil) 398 | { 399 | NSMutableArray *mutableAttributes = [[super accessibilityAttributeNames] mutableCopy]; 400 | if (mutableAttributes == nil) 401 | mutableAttributes = [NSMutableArray new]; 402 | 403 | // Add attributes 404 | if (![mutableAttributes containsObject:NSAccessibilityValueAttribute]) 405 | [mutableAttributes addObject:NSAccessibilityValueAttribute]; 406 | 407 | if (![mutableAttributes containsObject:NSAccessibilityEnabledAttribute]) 408 | [mutableAttributes addObject:NSAccessibilityEnabledAttribute]; 409 | 410 | if (![mutableAttributes containsObject:NSAccessibilityDescriptionAttribute]) 411 | [mutableAttributes addObject:NSAccessibilityDescriptionAttribute]; 412 | 413 | // Remove attributes 414 | if ([mutableAttributes containsObject:NSAccessibilityChildrenAttribute]) 415 | [mutableAttributes removeObject:NSAccessibilityChildrenAttribute]; 416 | 417 | attributes = [mutableAttributes copy]; 418 | } 419 | return attributes; 420 | } 421 | 422 | - (id)accessibilityAttributeValue:(NSString *)attribute { 423 | id retVal = nil; 424 | if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) 425 | retVal = NSAccessibilityCheckBoxRole; 426 | else if ([attribute isEqualToString:NSAccessibilityValueAttribute]) 427 | retVal = [NSNumber numberWithInt:self.isOn]; 428 | else if ([attribute isEqualToString:NSAccessibilityEnabledAttribute]) 429 | retVal = [NSNumber numberWithBool:[self isEnabled]]; 430 | else 431 | retVal = [super accessibilityAttributeValue:attribute]; 432 | return retVal; 433 | } 434 | 435 | - (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute { 436 | BOOL retVal; 437 | if ([attribute isEqualToString:NSAccessibilityValueAttribute]) 438 | retVal = YES; 439 | else if ([attribute isEqualToString:NSAccessibilityEnabledAttribute]) 440 | retVal = NO; 441 | else if ([attribute isEqualToString:NSAccessibilityDescriptionAttribute]) 442 | retVal = NO; 443 | else 444 | retVal = [super accessibilityIsAttributeSettable:attribute]; 445 | return retVal; 446 | } 447 | 448 | - (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute { 449 | if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { 450 | BOOL invokeTargetAction = self.isOn != [value boolValue]; 451 | self.on = [value boolValue]; 452 | if (invokeTargetAction) { 453 | [self _invokeTargetAction]; 454 | } 455 | } 456 | else { 457 | [super accessibilitySetValue:value forAttribute:attribute]; 458 | } 459 | } 460 | 461 | - (NSArray *)accessibilityActionNames { 462 | static NSArray *actions = nil; 463 | if (actions == nil) 464 | { 465 | NSMutableArray *mutableActions = [[super accessibilityActionNames] mutableCopy]; 466 | if (mutableActions == nil) 467 | mutableActions = [NSMutableArray new]; 468 | if (![mutableActions containsObject:NSAccessibilityPressAction]) 469 | [mutableActions addObject:NSAccessibilityPressAction]; 470 | actions = [mutableActions copy]; 471 | } 472 | return actions; 473 | } 474 | 475 | - (void)accessibilityPerformAction:(NSString *)actionString { 476 | if ([actionString isEqualToString:NSAccessibilityPressAction]) { 477 | self.on = ![self isOn]; 478 | [self _invokeTargetAction]; 479 | } 480 | else { 481 | [super accessibilityPerformAction:actionString]; 482 | } 483 | } 484 | 485 | @end 486 | -------------------------------------------------------------------------------- /LoLKR/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // LoLKR 4 | // 5 | // Created by Jaesung Koo on 3/28/15. 6 | // Copyright (c) 2015 Jaesung Koo. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import 11 | #import "ITSwitch.h" 12 | #import 13 | 14 | @implementation ViewController { 15 | 16 | __weak IBOutlet ITSwitch *itSwitch; 17 | __weak IBOutlet NSImageView *nginxImageView; 18 | __weak IBOutlet NSButton *patchAllButton; 19 | __weak IBOutlet NSProgressIndicator *progress; 20 | __unsafe_unretained IBOutlet NSTextView *textView; 21 | __weak IBOutlet NSViewController *configViewController; 22 | __weak IBOutlet NSTextField *labelKR; 23 | __weak IBOutlet NSTextField *labelNA; 24 | } 25 | 26 | - (void)awakeFromNib { 27 | [super awakeFromNib]; 28 | 29 | [progress stopAnimation:nil]; 30 | 31 | if ([[self runCommand:@"ps -ef | grep -v grep | grep nginx"] length] > 0) { 32 | nginxImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable]; 33 | itSwitch.enabled = YES; 34 | } else { 35 | nginxImageView.image = [NSImage imageNamed:NSImageNameStatusNone]; 36 | itSwitch.enabled = NO; 37 | } 38 | [itSwitch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"block_update"]]; 39 | 40 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(runAllScripts:) name:@"runAllScript" object:nil]; 41 | 42 | [self checkServerVersions]; 43 | 44 | // 1.3.0 45 | NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 46 | if (![userDefaults boolForKey:@"1.3.0"]) { 47 | [self disableControls]; 48 | dispatch_promise(^{ 49 | return [self runScript:@"1_nginx" arguments:@[[userDefaults objectForKey:@"port1"], 50 | [userDefaults objectForKey:@"port2"]]]; 51 | }).thenInBackground(^(NSNumber *status) { 52 | dispatch_sync(dispatch_get_main_queue(), ^{ 53 | textView.string = [textView.string stringByAppendingString:@"\nLoLKR 1.3.0 업데이트 완료\n\n"]; 54 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 55 | }); 56 | 57 | return 0; 58 | }).finally(^{ 59 | [self enableControls]; 60 | [userDefaults setObject:@YES forKey:@"1.3.0"]; 61 | }); 62 | } 63 | 64 | 65 | // 1.3.3 66 | if (![userDefaults boolForKey:@"1.3.3"] && [userDefaults objectForKey:@"lol_path"]) { 67 | NSString *currentPort = itSwitch.isOn ? [userDefaults objectForKey:@"port1"] : [userDefaults objectForKey:@"port2"]; 68 | 69 | dispatch_promise(^{ 70 | return [self runScript:@"3_lol" arguments:@[[userDefaults objectForKey:@"lol_path"], 71 | currentPort]]; 72 | }).thenInBackground(^(NSNumber *status) { 73 | dispatch_sync(dispatch_get_main_queue(), ^{ 74 | textView.string = [textView.string stringByAppendingString:@"\nLoLKR 1.3.3 업데이트 완료\n\n"]; 75 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 76 | }); 77 | 78 | return 0; 79 | }).finally(^{ 80 | [self enableControls]; 81 | [userDefaults setObject:@YES forKey:@"1.3.3"]; 82 | }); 83 | } 84 | } 85 | 86 | - (BOOL)isSameVersion { 87 | return [[[labelKR.stringValue componentsSeparatedByString:@" "] objectAtIndex:1] isEqualToString: 88 | [[labelNA.stringValue componentsSeparatedByString:@" "] objectAtIndex:1]]; 89 | } 90 | 91 | - (IBAction)patchButtonPressed:(id)sender { 92 | NSWindow *window = [[NSWindow alloc] init]; 93 | [window setContentView:configViewController.view]; 94 | [window setFrame:NSMakeRect(0, 0, 480, 340) display:YES]; 95 | 96 | // 서버 버전이 다르면 경고 메세지 97 | if (![self isSameVersion]) { 98 | NSAlert *alert = [NSAlert new]; 99 | [alert setAlertStyle:NSWarningAlertStyle]; 100 | [alert setMessageText:@"북미와 버전이 다릅니다."]; 101 | [alert setInformativeText:@"업데이트 기간에 패치를 하면 자동으로 북미버전으로 업데이트가 됩니다. 그래도 계속하시겠습니까? 패치하기는 최초에 한번만 하면 됩니다."]; 102 | [alert addButtonWithTitle:@"패치하기"]; 103 | [alert addButtonWithTitle:@"취소"]; 104 | [alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) { 105 | if (returnCode == NSAlertFirstButtonReturn) { 106 | [self.view.window beginSheet:window completionHandler:nil]; 107 | } 108 | }]; 109 | } else { 110 | [self.view.window beginSheet:window completionHandler:nil]; 111 | } 112 | } 113 | 114 | - (IBAction)switchValueChanged:(id)sender { 115 | ITSwitch *switchControl = (ITSwitch *)sender; 116 | if (!switchControl.isOn) { 117 | if (![self isSameVersion]) { 118 | NSAlert *alert = [NSAlert new]; 119 | [alert setAlertStyle:NSWarningAlertStyle]; 120 | [alert setMessageText:@"주의"]; 121 | [alert setInformativeText:@"자동 업데이트를 허용하면 한국 서버 클라이언트가 업데이트 됩니다. 북미 서버 기준으로 한국 서버와 버전이 다르면 업데이트가 진행되어 한국 서버에 접속이 안될 수 있습니다. 한국서버 버전이 미국 서버와 같아지면 업데이트를 진행하세요."]; 122 | [alert addButtonWithTitle:@"자동 업데이트 허용"]; 123 | [alert addButtonWithTitle:@"취소"]; 124 | [alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) { 125 | if (returnCode == NSAlertSecondButtonReturn) { 126 | [switchControl setOn:YES]; 127 | } else { 128 | NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"2_download_versions" ofType:@"sh"]; 129 | scriptPath = [NSString stringWithFormat:@"\"%@\"", scriptPath]; 130 | 131 | dispatch_queue_t taskQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 132 | dispatch_async(taskQueue, ^{ 133 | progress.hidden = NO; 134 | itSwitch.enabled = NO; 135 | [progress startAnimation:nil]; 136 | 137 | NSNumber *status = [self runScript:@"update" arguments:@[@"on", 138 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port1"], 139 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port2"], 140 | [[NSUserDefaults standardUserDefaults] objectForKey:@"lol_path"], 141 | scriptPath 142 | ]]; 143 | if ([status intValue] == 0) { 144 | [[NSUserDefaults standardUserDefaults] setObject:@NO forKey:@"block_update"]; 145 | dispatch_sync(dispatch_get_main_queue(), ^{ 146 | textView.string = [textView.string stringByAppendingString:@"\n\n"]; 147 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 148 | }); 149 | } 150 | 151 | [progress stopAnimation:nil]; 152 | itSwitch.enabled = YES; 153 | }); 154 | } 155 | }]; 156 | } else { 157 | NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"2_download_versions" ofType:@"sh"]; 158 | scriptPath = [NSString stringWithFormat:@"\"%@\"", scriptPath]; 159 | 160 | dispatch_queue_t taskQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 161 | dispatch_async(taskQueue, ^{ 162 | progress.hidden = NO; 163 | itSwitch.enabled = NO; 164 | [progress startAnimation:nil]; 165 | 166 | NSNumber *status = [self runScript:@"update" arguments:@[@"on", 167 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port1"], 168 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port2"], 169 | [[NSUserDefaults standardUserDefaults] objectForKey:@"lol_path"], 170 | scriptPath 171 | ]]; 172 | if ([status intValue] == 0) { 173 | [[NSUserDefaults standardUserDefaults] setObject:@NO forKey:@"block_update"]; 174 | dispatch_sync(dispatch_get_main_queue(), ^{ 175 | textView.string = [textView.string stringByAppendingString:@"\n\n"]; 176 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 177 | }); 178 | } 179 | 180 | [progress stopAnimation:nil]; 181 | itSwitch.enabled = YES; 182 | }); 183 | } 184 | } else { 185 | dispatch_queue_t taskQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 186 | dispatch_async(taskQueue, ^{ 187 | progress.hidden = NO; 188 | itSwitch.enabled = NO; 189 | [progress startAnimation:nil]; 190 | 191 | NSNumber *status = [self runScript:@"update" arguments:@[@"off", 192 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port1"], 193 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port2"], 194 | [[NSUserDefaults standardUserDefaults] objectForKey:@"lol_path"]]]; 195 | if ([status intValue] == 0) { 196 | [[NSUserDefaults standardUserDefaults] setObject:@YES forKey:@"block_update"]; 197 | dispatch_sync(dispatch_get_main_queue(), ^{ 198 | textView.string = [textView.string stringByAppendingString:@"\n\n"]; 199 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 200 | }); 201 | } 202 | 203 | itSwitch.enabled = YES; 204 | [progress stopAnimation:nil]; 205 | }); 206 | } 207 | } 208 | 209 | - (void)runAllScripts:(NSNotification *)noti { 210 | [self disableControls]; 211 | 212 | __block BOOL success = YES; 213 | 214 | dispatch_promise(^{ 215 | if ([[[noti userInfo] objectForKey:@"install_nginx"] boolValue]) { 216 | return [self runScript:@"1_nginx" arguments:@[[[NSUserDefaults standardUserDefaults] objectForKey:@"port1"], 217 | [[NSUserDefaults standardUserDefaults] objectForKey:@"port2"]]]; 218 | } else { 219 | return [NSNumber numberWithInt:0]; 220 | } 221 | }).thenInBackground(^(NSNumber *status) { 222 | if ([status intValue] == 0) { 223 | dispatch_sync(dispatch_get_main_queue(), ^{ 224 | textView.string = [textView.string stringByAppendingString:@"완료\n\n"]; 225 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 226 | }); 227 | 228 | return [self runScript:@"2_download_versions" arguments:@[]]; 229 | } else { 230 | success = NO; 231 | return [NSNumber numberWithInt:-1]; 232 | } 233 | }).thenInBackground(^(NSNumber *status) { 234 | if ([status intValue] == 0) { 235 | dispatch_sync(dispatch_get_main_queue(), ^{ 236 | textView.string = [textView.string stringByAppendingString:@"완료\n\n"]; 237 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 238 | }); 239 | 240 | NSString *currentPort = itSwitch.isOn ? [[NSUserDefaults standardUserDefaults] objectForKey:@"port1"] 241 | : [[NSUserDefaults standardUserDefaults] objectForKey:@"port2"]; 242 | 243 | NSNumber *status3 = [self runScript:@"3_lol" arguments:@[[[NSUserDefaults standardUserDefaults] objectForKey:@"lol_path"], 244 | currentPort]]; 245 | 246 | if ([status3 intValue] == 0) { 247 | dispatch_sync(dispatch_get_main_queue(), ^{ 248 | textView.string = [textView.string stringByAppendingString:@"완료\n\n"]; 249 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 250 | }); 251 | } else { 252 | success = NO; 253 | } 254 | } else { 255 | success = NO; 256 | } 257 | }).finally(^{ 258 | [self enableControls]; 259 | 260 | if (success) { 261 | textView.string = [textView.string stringByAppendingString:@"한글 패치가 모두 완료되었습니다. 롤을 다시 실행해 주세요.\n\n"]; 262 | [textView scrollRangeToVisible:NSMakeRange([textView.string length], 0)]; 263 | } 264 | }); 265 | } 266 | 267 | - (void)disableControls { 268 | itSwitch.enabled = NO; 269 | patchAllButton.enabled = NO; 270 | progress.hidden = NO; 271 | [progress startAnimation:nil]; 272 | } 273 | 274 | - (void)enableControls { 275 | [progress stopAnimation:nil]; 276 | patchAllButton.enabled = YES; 277 | itSwitch.enabled = YES; 278 | } 279 | 280 | - (NSNumber *)runScript:(NSString *)scriptName arguments:(NSArray *)arguments { 281 | textView.string = [textView.string stringByAppendingString:[NSString stringWithFormat:@"%@.sh\n", scriptName]]; 282 | 283 | NSString *scriptFile = [[NSBundle mainBundle] pathForResource:scriptName ofType:@"sh"]; 284 | 285 | NSTask *task = [[NSTask alloc] init]; 286 | [task setLaunchPath:@"/bin/sh"]; 287 | [task setArguments:@[@"-c", [NSString stringWithFormat:@"\"%@\" %@", scriptFile, [arguments componentsJoinedByString:@" "]]]]; 288 | 289 | NSPipe *pipe = [NSPipe pipe]; 290 | [task setStandardOutput: pipe]; 291 | 292 | [[pipe fileHandleForReading] waitForDataInBackgroundAndNotify]; 293 | [[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification object:[pipe fileHandleForReading] queue:nil usingBlock:^(NSNotification *notification){ 294 | // 295 | NSData *output = [[pipe fileHandleForReading] availableData]; 296 | NSString *outStr = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding]; 297 | // 298 | if ([outStr length] > 0) { 299 | textView.string = [textView.string stringByAppendingString:[NSString stringWithFormat:@"\n%@", outStr]]; 300 | } 301 | // 302 | [[pipe fileHandleForReading] waitForDataInBackgroundAndNotify]; 303 | }]; 304 | 305 | [task launch]; 306 | [task waitUntilExit]; 307 | 308 | return [NSNumber numberWithInt:[task terminationStatus]]; 309 | } 310 | 311 | - (NSString *)runCommand:(NSString *)commandToRun 312 | { 313 | NSTask *task; 314 | task = [[NSTask alloc] init]; 315 | [task setLaunchPath: @"/bin/sh"]; 316 | 317 | NSArray *arguments = [NSArray arrayWithObjects: 318 | @"-c" , 319 | [NSString stringWithFormat:@"%@", commandToRun], 320 | nil]; 321 | [task setArguments: arguments]; 322 | 323 | NSPipe *pipe; 324 | pipe = [NSPipe pipe]; 325 | [task setStandardOutput: pipe]; 326 | 327 | NSFileHandle *file; 328 | file = [pipe fileHandleForReading]; 329 | 330 | [task launch]; 331 | 332 | NSData *data; 333 | data = [file readDataToEndOfFile]; 334 | 335 | NSString *output; 336 | output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 337 | return output; 338 | } 339 | 340 | #pragma mark - 서버 버전 체크 341 | 342 | - (void)checkServerVersions { 343 | [self parseKRServer]; 344 | [self parseNAServer:0]; 345 | } 346 | 347 | - (void)parseKRServer { 348 | NSError *error = nil; 349 | NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(\\d+\\.\\d+) 패치 노트" options:0 error:&error]; 350 | 351 | NSURL *URL = [NSURL URLWithString:@"http://www.leagueoflegends.co.kr/?m=news&cate=update"]; 352 | NSURLSession *session = [NSURLSession sharedSession]; 353 | [[session dataTaskWithURL:URL completionHandler: 354 | ^(NSData *data, NSURLResponse *response, NSError *error) { 355 | NSString *contentType = nil; 356 | if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 357 | NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; 358 | contentType = headers[@"Content-Type"]; 359 | } 360 | HTMLDocument *document = [HTMLDocument documentWithData:data 361 | contentTypeHeader:contentType]; 362 | NSArray *rows = [document nodesMatchingSelector:@".tleft"]; 363 | NSString *currentVersion = nil; 364 | for (HTMLElement *row in rows) { 365 | NSTextCheckingResult *match = [regex firstMatchInString:row.textContent options:0 range:NSMakeRange(0, row.textContent.length)]; 366 | if (match.range.length != 0) { 367 | currentVersion = [row.textContent substringWithRange:[match rangeAtIndex:1]]; 368 | [labelKR setStringValue:[NSString stringWithFormat:@"한국 서버: %@", currentVersion]]; 369 | break; 370 | } 371 | } 372 | }] resume]; 373 | } 374 | 375 | - (void)parseNAServer:(int)page { 376 | NSError *error = nil; 377 | NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"Patch (\\d+\\.\\d+) [Nn]otes?" options:0 error:&error]; 378 | 379 | NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://oce.leagueoflegends.com/en/news?page=%d", page]]; 380 | NSURLSession *session = [NSURLSession sharedSession]; 381 | [[session dataTaskWithURL:URL completionHandler: 382 | ^(NSData *data, NSURLResponse *response, NSError *error) { 383 | NSString *contentType = nil; 384 | if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 385 | NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields]; 386 | contentType = headers[@"Content-Type"]; 387 | } 388 | HTMLDocument *document = [HTMLDocument documentWithData:data 389 | contentTypeHeader:contentType]; 390 | NSArray *rows = [document nodesMatchingSelector:@".default-2-3 h4 a"]; 391 | NSString *currentVersion = nil; 392 | for (HTMLElement *row in rows) { 393 | NSTextCheckingResult *match = [regex firstMatchInString:row.textContent options:0 range:NSMakeRange(0, row.textContent.length)]; 394 | if (match.range.length != 0) { 395 | currentVersion = [row.textContent substringWithRange:[match rangeAtIndex:1]]; 396 | [labelNA setStringValue:[NSString stringWithFormat:@"오세아니아 서버: %@", currentVersion]]; 397 | break; 398 | } 399 | } 400 | if (currentVersion == nil) { 401 | [self parseNAServer:page+1]; 402 | } 403 | 404 | }] resume]; 405 | } 406 | 407 | @end 408 | -------------------------------------------------------------------------------- /LoLKR.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B386F99F263A1A9AE38AE082 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 08ADF3F2B1BE18C3FA711AC7 /* libPods.a */; }; 11 | B60E118D1C952D480022EDCF /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B60E118B1C95202F0022EDCF /* Sparkle.framework */; }; 12 | B60E118E1C952D480022EDCF /* Sparkle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B60E118B1C95202F0022EDCF /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 13 | B61B57FD1AD69ECB006558AA /* 1_nginx.sh in Resources */ = {isa = PBXBuildFile; fileRef = B61B57FC1AD69DB7006558AA /* 1_nginx.sh */; }; 14 | B61B57FF1AD6A0EB006558AA /* 2_download_versions.sh in Resources */ = {isa = PBXBuildFile; fileRef = B61B57FE1AD6A0EB006558AA /* 2_download_versions.sh */; }; 15 | B61B58011AD6A6B2006558AA /* 3_lol.sh in Resources */ = {isa = PBXBuildFile; fileRef = B61B58001AD6A6B2006558AA /* 3_lol.sh */; }; 16 | B62DFFDA1AE57E2A0018489A /* Main.xib in Resources */ = {isa = PBXBuildFile; fileRef = B62DFFD91AE57E2A0018489A /* Main.xib */; }; 17 | B65832AD1ACDBB3800B781E2 /* ITSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = B65832AC1ACDBB3800B781E2 /* ITSwitch.m */; }; 18 | B66000D41ADC393D00C18BB9 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B66000D31ADC393D00C18BB9 /* LICENSE */; }; 19 | B67E1D5A1AC68578003FA730 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B67E1D591AC68578003FA730 /* AppDelegate.m */; }; 20 | B67E1D5C1AC68578003FA730 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B67E1D5B1AC68578003FA730 /* main.m */; }; 21 | B67E1D5F1AC68578003FA730 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B67E1D5E1AC68578003FA730 /* ViewController.m */; }; 22 | B67E1D611AC68578003FA730 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B67E1D601AC68578003FA730 /* Images.xcassets */; }; 23 | B67E1D701AC68578003FA730 /* LoLKRTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B67E1D6F1AC68578003FA730 /* LoLKRTests.m */; }; 24 | B69F06A21AD735B2005802FA /* update.sh in Resources */ = {isa = PBXBuildFile; fileRef = B69F06A11AD735B2005802FA /* update.sh */; }; 25 | B6F35B411AD9C2DD00DED4C8 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = B6F35B401AD9C2DD00DED4C8 /* Credits.rtf */; }; 26 | B6F35B441AD9C4D100DED4C8 /* ConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B6F35B431AD9C4D100DED4C8 /* ConfigViewController.m */; }; 27 | B6FE8E891ADFF84C00F0C7E3 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = B6FE8E881ADFF84C00F0C7E3 /* dsa_pub.pem */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | B67E1D6A1AC68578003FA730 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = B67E1D4B1AC68578003FA730 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = B67E1D521AC68578003FA730; 36 | remoteInfo = LoLKR; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXCopyFilesBuildPhase section */ 41 | B60E118F1C952D490022EDCF /* Embed Frameworks */ = { 42 | isa = PBXCopyFilesBuildPhase; 43 | buildActionMask = 2147483647; 44 | dstPath = ""; 45 | dstSubfolderSpec = 10; 46 | files = ( 47 | B60E118E1C952D480022EDCF /* Sparkle.framework in Embed Frameworks */, 48 | ); 49 | name = "Embed Frameworks"; 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXCopyFilesBuildPhase section */ 53 | 54 | /* Begin PBXFileReference section */ 55 | 08ADF3F2B1BE18C3FA711AC7 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | 2C10437A67E8042E60E47DB9 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 57 | 450107DDDFF60139139CA600 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 58 | B60AFEA01ADBED72008A6547 /* README.md */ = {isa = PBXFileReference; explicitFileType = net.daringfireball.markdown; fileEncoding = 4; path = README.md; sourceTree = ""; }; 59 | B60E118B1C95202F0022EDCF /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Pods/Sparkle/Sparkle.framework; sourceTree = ""; }; 60 | B61B57FC1AD69DB7006558AA /* 1_nginx.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = 1_nginx.sh; sourceTree = ""; }; 61 | B61B57FE1AD6A0EB006558AA /* 2_download_versions.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = 2_download_versions.sh; sourceTree = ""; }; 62 | B61B58001AD6A6B2006558AA /* 3_lol.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = 3_lol.sh; sourceTree = ""; }; 63 | B62DFFD91AE57E2A0018489A /* Main.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Main.xib; sourceTree = ""; }; 64 | B62DFFDB1AE59AAB0018489A /* updates.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = updates.xml; sourceTree = ""; }; 65 | B65832AB1ACDBB3800B781E2 /* ITSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITSwitch.h; sourceTree = ""; }; 66 | B65832AC1ACDBB3800B781E2 /* ITSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ITSwitch.m; sourceTree = ""; }; 67 | B66000D31ADC393D00C18BB9 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 68 | B67E1D531AC68578003FA730 /* 롤 한국 서버 패치.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "롤 한국 서버 패치.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 69 | B67E1D571AC68578003FA730 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 70 | B67E1D581AC68578003FA730 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 71 | B67E1D591AC68578003FA730 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 72 | B67E1D5B1AC68578003FA730 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 73 | B67E1D5D1AC68578003FA730 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 74 | B67E1D5E1AC68578003FA730 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 75 | B67E1D601AC68578003FA730 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 76 | B67E1D691AC68578003FA730 /* LoLKRTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LoLKRTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 77 | B67E1D6E1AC68578003FA730 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 78 | B67E1D6F1AC68578003FA730 /* LoLKRTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoLKRTests.m; sourceTree = ""; }; 79 | B69F06A11AD735B2005802FA /* update.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = update.sh; sourceTree = ""; }; 80 | B6F35B401AD9C2DD00DED4C8 /* Credits.rtf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 81 | B6F35B421AD9C4D100DED4C8 /* ConfigViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigViewController.h; sourceTree = ""; }; 82 | B6F35B431AD9C4D100DED4C8 /* ConfigViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConfigViewController.m; sourceTree = ""; }; 83 | B6FE8E881ADFF84C00F0C7E3 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = ""; }; 84 | /* End PBXFileReference section */ 85 | 86 | /* Begin PBXFrameworksBuildPhase section */ 87 | B67E1D501AC68578003FA730 /* Frameworks */ = { 88 | isa = PBXFrameworksBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | B386F99F263A1A9AE38AE082 /* libPods.a in Frameworks */, 92 | B60E118D1C952D480022EDCF /* Sparkle.framework in Frameworks */, 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | B67E1D661AC68578003FA730 /* Frameworks */ = { 97 | isa = PBXFrameworksBuildPhase; 98 | buildActionMask = 2147483647; 99 | files = ( 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | /* End PBXFrameworksBuildPhase section */ 104 | 105 | /* Begin PBXGroup section */ 106 | 9040D2FE732414D2DBEF2054 /* Pods */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 2C10437A67E8042E60E47DB9 /* Pods.debug.xcconfig */, 110 | 450107DDDFF60139139CA600 /* Pods.release.xcconfig */, 111 | ); 112 | name = Pods; 113 | sourceTree = ""; 114 | }; 115 | B61B57FB1AD69DA3006558AA /* scripts */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | B61B57FC1AD69DB7006558AA /* 1_nginx.sh */, 119 | B61B57FE1AD6A0EB006558AA /* 2_download_versions.sh */, 120 | B61B58001AD6A6B2006558AA /* 3_lol.sh */, 121 | B69F06A11AD735B2005802FA /* update.sh */, 122 | ); 123 | name = scripts; 124 | sourceTree = ""; 125 | }; 126 | B65832AA1ACDBB2F00B781E2 /* ITSwitch */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | B65832AB1ACDBB3800B781E2 /* ITSwitch.h */, 130 | B65832AC1ACDBB3800B781E2 /* ITSwitch.m */, 131 | ); 132 | name = ITSwitch; 133 | sourceTree = ""; 134 | }; 135 | B67E1D4A1AC68578003FA730 = { 136 | isa = PBXGroup; 137 | children = ( 138 | B62DFFDB1AE59AAB0018489A /* updates.xml */, 139 | B66000D31ADC393D00C18BB9 /* LICENSE */, 140 | B60AFEA01ADBED72008A6547 /* README.md */, 141 | B67E1D551AC68578003FA730 /* LoLKR */, 142 | B67E1D6C1AC68578003FA730 /* LoLKRTests */, 143 | B67E1D541AC68578003FA730 /* Products */, 144 | 9040D2FE732414D2DBEF2054 /* Pods */, 145 | CC3FC6C2389B3786836051F4 /* Frameworks */, 146 | ); 147 | sourceTree = ""; 148 | }; 149 | B67E1D541AC68578003FA730 /* Products */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | B67E1D531AC68578003FA730 /* 롤 한국 서버 패치.app */, 153 | B67E1D691AC68578003FA730 /* LoLKRTests.xctest */, 154 | ); 155 | name = Products; 156 | sourceTree = ""; 157 | }; 158 | B67E1D551AC68578003FA730 /* LoLKR */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | B65832AA1ACDBB2F00B781E2 /* ITSwitch */, 162 | B67E1D581AC68578003FA730 /* AppDelegate.h */, 163 | B67E1D591AC68578003FA730 /* AppDelegate.m */, 164 | B67E1D5D1AC68578003FA730 /* ViewController.h */, 165 | B67E1D5E1AC68578003FA730 /* ViewController.m */, 166 | B6F35B421AD9C4D100DED4C8 /* ConfigViewController.h */, 167 | B6F35B431AD9C4D100DED4C8 /* ConfigViewController.m */, 168 | B67E1D601AC68578003FA730 /* Images.xcassets */, 169 | B62DFFD91AE57E2A0018489A /* Main.xib */, 170 | B67E1D561AC68578003FA730 /* Supporting Files */, 171 | ); 172 | path = LoLKR; 173 | sourceTree = ""; 174 | }; 175 | B67E1D561AC68578003FA730 /* Supporting Files */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | B61B57FB1AD69DA3006558AA /* scripts */, 179 | B67E1D571AC68578003FA730 /* Info.plist */, 180 | B6FE8E881ADFF84C00F0C7E3 /* dsa_pub.pem */, 181 | B67E1D5B1AC68578003FA730 /* main.m */, 182 | B6F35B401AD9C2DD00DED4C8 /* Credits.rtf */, 183 | ); 184 | name = "Supporting Files"; 185 | sourceTree = ""; 186 | }; 187 | B67E1D6C1AC68578003FA730 /* LoLKRTests */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | B67E1D6F1AC68578003FA730 /* LoLKRTests.m */, 191 | B67E1D6D1AC68578003FA730 /* Supporting Files */, 192 | ); 193 | path = LoLKRTests; 194 | sourceTree = ""; 195 | }; 196 | B67E1D6D1AC68578003FA730 /* Supporting Files */ = { 197 | isa = PBXGroup; 198 | children = ( 199 | B67E1D6E1AC68578003FA730 /* Info.plist */, 200 | ); 201 | name = "Supporting Files"; 202 | sourceTree = ""; 203 | }; 204 | CC3FC6C2389B3786836051F4 /* Frameworks */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | B60E118B1C95202F0022EDCF /* Sparkle.framework */, 208 | 08ADF3F2B1BE18C3FA711AC7 /* libPods.a */, 209 | ); 210 | name = Frameworks; 211 | sourceTree = ""; 212 | }; 213 | /* End PBXGroup section */ 214 | 215 | /* Begin PBXNativeTarget section */ 216 | B67E1D521AC68578003FA730 /* LoLKR */ = { 217 | isa = PBXNativeTarget; 218 | buildConfigurationList = B67E1D731AC68578003FA730 /* Build configuration list for PBXNativeTarget "LoLKR" */; 219 | buildPhases = ( 220 | 6F542155D9C57AEB94942905 /* Check Pods Manifest.lock */, 221 | B67E1D4F1AC68578003FA730 /* Sources */, 222 | B67E1D501AC68578003FA730 /* Frameworks */, 223 | B67E1D511AC68578003FA730 /* Resources */, 224 | 1A38A10BD7AD76A6B9BDD7D5 /* Copy Pods Resources */, 225 | B60E118F1C952D490022EDCF /* Embed Frameworks */, 226 | B622A3471B076E82007D1755 /* ShellScript */, 227 | A7663C9FBCE051AEAB373D5B /* Embed Pods Frameworks */, 228 | ); 229 | buildRules = ( 230 | ); 231 | dependencies = ( 232 | ); 233 | name = LoLKR; 234 | productName = LoLKR; 235 | productReference = B67E1D531AC68578003FA730 /* 롤 한국 서버 패치.app */; 236 | productType = "com.apple.product-type.application"; 237 | }; 238 | B67E1D681AC68578003FA730 /* LoLKRTests */ = { 239 | isa = PBXNativeTarget; 240 | buildConfigurationList = B67E1D761AC68578003FA730 /* Build configuration list for PBXNativeTarget "LoLKRTests" */; 241 | buildPhases = ( 242 | B67E1D651AC68578003FA730 /* Sources */, 243 | B67E1D661AC68578003FA730 /* Frameworks */, 244 | B67E1D671AC68578003FA730 /* Resources */, 245 | ); 246 | buildRules = ( 247 | ); 248 | dependencies = ( 249 | B67E1D6B1AC68578003FA730 /* PBXTargetDependency */, 250 | ); 251 | name = LoLKRTests; 252 | productName = LoLKRTests; 253 | productReference = B67E1D691AC68578003FA730 /* LoLKRTests.xctest */; 254 | productType = "com.apple.product-type.bundle.unit-test"; 255 | }; 256 | /* End PBXNativeTarget section */ 257 | 258 | /* Begin PBXProject section */ 259 | B67E1D4B1AC68578003FA730 /* Project object */ = { 260 | isa = PBXProject; 261 | attributes = { 262 | KnownAssetTags = ( 263 | New, 264 | ); 265 | LastUpgradeCheck = 0720; 266 | ORGANIZATIONNAME = "Jaesung Koo"; 267 | TargetAttributes = { 268 | B67E1D521AC68578003FA730 = { 269 | CreatedOnToolsVersion = 6.2; 270 | DevelopmentTeam = F6U7JSUCV5; 271 | }; 272 | B67E1D681AC68578003FA730 = { 273 | CreatedOnToolsVersion = 6.2; 274 | TestTargetID = B67E1D521AC68578003FA730; 275 | }; 276 | }; 277 | }; 278 | buildConfigurationList = B67E1D4E1AC68578003FA730 /* Build configuration list for PBXProject "LoLKR" */; 279 | compatibilityVersion = "Xcode 3.2"; 280 | developmentRegion = English; 281 | hasScannedForEncodings = 0; 282 | knownRegions = ( 283 | en, 284 | Base, 285 | ); 286 | mainGroup = B67E1D4A1AC68578003FA730; 287 | productRefGroup = B67E1D541AC68578003FA730 /* Products */; 288 | projectDirPath = ""; 289 | projectRoot = ""; 290 | targets = ( 291 | B67E1D521AC68578003FA730 /* LoLKR */, 292 | B67E1D681AC68578003FA730 /* LoLKRTests */, 293 | ); 294 | }; 295 | /* End PBXProject section */ 296 | 297 | /* Begin PBXResourcesBuildPhase section */ 298 | B67E1D511AC68578003FA730 /* Resources */ = { 299 | isa = PBXResourcesBuildPhase; 300 | buildActionMask = 2147483647; 301 | files = ( 302 | B61B57FD1AD69ECB006558AA /* 1_nginx.sh in Resources */, 303 | B69F06A21AD735B2005802FA /* update.sh in Resources */, 304 | B61B57FF1AD6A0EB006558AA /* 2_download_versions.sh in Resources */, 305 | B67E1D611AC68578003FA730 /* Images.xcassets in Resources */, 306 | B62DFFDA1AE57E2A0018489A /* Main.xib in Resources */, 307 | B6FE8E891ADFF84C00F0C7E3 /* dsa_pub.pem in Resources */, 308 | B6F35B411AD9C2DD00DED4C8 /* Credits.rtf in Resources */, 309 | B66000D41ADC393D00C18BB9 /* LICENSE in Resources */, 310 | B61B58011AD6A6B2006558AA /* 3_lol.sh in Resources */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | B67E1D671AC68578003FA730 /* Resources */ = { 315 | isa = PBXResourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | /* End PBXResourcesBuildPhase section */ 322 | 323 | /* Begin PBXShellScriptBuildPhase section */ 324 | 1A38A10BD7AD76A6B9BDD7D5 /* Copy Pods Resources */ = { 325 | isa = PBXShellScriptBuildPhase; 326 | buildActionMask = 2147483647; 327 | files = ( 328 | ); 329 | inputPaths = ( 330 | ); 331 | name = "Copy Pods Resources"; 332 | outputPaths = ( 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | shellPath = /bin/sh; 336 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; 337 | showEnvVarsInLog = 0; 338 | }; 339 | 6F542155D9C57AEB94942905 /* Check Pods Manifest.lock */ = { 340 | isa = PBXShellScriptBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | ); 344 | inputPaths = ( 345 | ); 346 | name = "Check Pods Manifest.lock"; 347 | outputPaths = ( 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | shellPath = /bin/sh; 351 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 352 | showEnvVarsInLog = 0; 353 | }; 354 | A7663C9FBCE051AEAB373D5B /* Embed Pods Frameworks */ = { 355 | isa = PBXShellScriptBuildPhase; 356 | buildActionMask = 2147483647; 357 | files = ( 358 | ); 359 | inputPaths = ( 360 | ); 361 | name = "Embed Pods Frameworks"; 362 | outputPaths = ( 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | shellPath = /bin/sh; 366 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; 367 | showEnvVarsInLog = 0; 368 | }; 369 | B622A3471B076E82007D1755 /* ShellScript */ = { 370 | isa = PBXShellScriptBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | inputPaths = ( 375 | ); 376 | outputPaths = ( 377 | ); 378 | runOnlyForDeploymentPostprocessing = 0; 379 | shellPath = /bin/sh; 380 | shellScript = "LOCATION=\"${BUILT_PRODUCTS_DIR}\"/\"${FRAMEWORKS_FOLDER_PATH}\"\n\n# Usually set by Xcode\nCODE_SIGN_IDENTITY=\"Mac Developer: Jaesung Koo (JX3RHMUU32)\"\n\ncodesign --verbose --force --sign \"$CODE_SIGN_IDENTITY\" \"$LOCATION/Sparkle.framework/Versions/A\""; 381 | showEnvVarsInLog = 0; 382 | }; 383 | /* End PBXShellScriptBuildPhase section */ 384 | 385 | /* Begin PBXSourcesBuildPhase section */ 386 | B67E1D4F1AC68578003FA730 /* Sources */ = { 387 | isa = PBXSourcesBuildPhase; 388 | buildActionMask = 2147483647; 389 | files = ( 390 | B65832AD1ACDBB3800B781E2 /* ITSwitch.m in Sources */, 391 | B67E1D5F1AC68578003FA730 /* ViewController.m in Sources */, 392 | B67E1D5C1AC68578003FA730 /* main.m in Sources */, 393 | B67E1D5A1AC68578003FA730 /* AppDelegate.m in Sources */, 394 | B6F35B441AD9C4D100DED4C8 /* ConfigViewController.m in Sources */, 395 | ); 396 | runOnlyForDeploymentPostprocessing = 0; 397 | }; 398 | B67E1D651AC68578003FA730 /* Sources */ = { 399 | isa = PBXSourcesBuildPhase; 400 | buildActionMask = 2147483647; 401 | files = ( 402 | B67E1D701AC68578003FA730 /* LoLKRTests.m in Sources */, 403 | ); 404 | runOnlyForDeploymentPostprocessing = 0; 405 | }; 406 | /* End PBXSourcesBuildPhase section */ 407 | 408 | /* Begin PBXTargetDependency section */ 409 | B67E1D6B1AC68578003FA730 /* PBXTargetDependency */ = { 410 | isa = PBXTargetDependency; 411 | target = B67E1D521AC68578003FA730 /* LoLKR */; 412 | targetProxy = B67E1D6A1AC68578003FA730 /* PBXContainerItemProxy */; 413 | }; 414 | /* End PBXTargetDependency section */ 415 | 416 | /* Begin XCBuildConfiguration section */ 417 | B67E1D711AC68578003FA730 /* Debug */ = { 418 | isa = XCBuildConfiguration; 419 | buildSettings = { 420 | ALWAYS_SEARCH_USER_PATHS = NO; 421 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 422 | CLANG_CXX_LIBRARY = "libc++"; 423 | CLANG_ENABLE_MODULES = YES; 424 | CLANG_ENABLE_OBJC_ARC = YES; 425 | CLANG_WARN_BOOL_CONVERSION = YES; 426 | CLANG_WARN_CONSTANT_CONVERSION = YES; 427 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 428 | CLANG_WARN_EMPTY_BODY = YES; 429 | CLANG_WARN_ENUM_CONVERSION = YES; 430 | CLANG_WARN_INT_CONVERSION = YES; 431 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 432 | CLANG_WARN_UNREACHABLE_CODE = YES; 433 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 434 | CODE_SIGN_IDENTITY = "-"; 435 | COPY_PHASE_STRIP = NO; 436 | ENABLE_STRICT_OBJC_MSGSEND = YES; 437 | ENABLE_TESTABILITY = YES; 438 | GCC_C_LANGUAGE_STANDARD = gnu99; 439 | GCC_DYNAMIC_NO_PIC = NO; 440 | GCC_OPTIMIZATION_LEVEL = 0; 441 | GCC_PREPROCESSOR_DEFINITIONS = ( 442 | "DEBUG=1", 443 | "$(inherited)", 444 | ); 445 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 446 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 447 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 448 | GCC_WARN_UNDECLARED_SELECTOR = YES; 449 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 450 | GCC_WARN_UNUSED_FUNCTION = YES; 451 | GCC_WARN_UNUSED_VARIABLE = YES; 452 | MACOSX_DEPLOYMENT_TARGET = 10.10; 453 | MTL_ENABLE_DEBUG_INFO = YES; 454 | ONLY_ACTIVE_ARCH = YES; 455 | SDKROOT = macosx; 456 | }; 457 | name = Debug; 458 | }; 459 | B67E1D721AC68578003FA730 /* Release */ = { 460 | isa = XCBuildConfiguration; 461 | buildSettings = { 462 | ALWAYS_SEARCH_USER_PATHS = NO; 463 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 464 | CLANG_CXX_LIBRARY = "libc++"; 465 | CLANG_ENABLE_MODULES = YES; 466 | CLANG_ENABLE_OBJC_ARC = YES; 467 | CLANG_WARN_BOOL_CONVERSION = YES; 468 | CLANG_WARN_CONSTANT_CONVERSION = YES; 469 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 470 | CLANG_WARN_EMPTY_BODY = YES; 471 | CLANG_WARN_ENUM_CONVERSION = YES; 472 | CLANG_WARN_INT_CONVERSION = YES; 473 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 474 | CLANG_WARN_UNREACHABLE_CODE = YES; 475 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 476 | CODE_SIGN_IDENTITY = "-"; 477 | COPY_PHASE_STRIP = NO; 478 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 479 | ENABLE_NS_ASSERTIONS = NO; 480 | ENABLE_STRICT_OBJC_MSGSEND = YES; 481 | GCC_C_LANGUAGE_STANDARD = gnu99; 482 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 483 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 484 | GCC_WARN_UNDECLARED_SELECTOR = YES; 485 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 486 | GCC_WARN_UNUSED_FUNCTION = YES; 487 | GCC_WARN_UNUSED_VARIABLE = YES; 488 | MACOSX_DEPLOYMENT_TARGET = 10.10; 489 | MTL_ENABLE_DEBUG_INFO = NO; 490 | SDKROOT = macosx; 491 | }; 492 | name = Release; 493 | }; 494 | B67E1D741AC68578003FA730 /* Debug */ = { 495 | isa = XCBuildConfiguration; 496 | baseConfigurationReference = 2C10437A67E8042E60E47DB9 /* Pods.debug.xcconfig */; 497 | buildSettings = { 498 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 499 | CODE_SIGN_IDENTITY = "Mac Developer"; 500 | COMBINE_HIDPI_IMAGES = YES; 501 | FRAMEWORK_SEARCH_PATHS = ( 502 | "$(inherited)", 503 | "$(PROJECT_DIR)/Pods/Sparkle", 504 | ); 505 | INFOPLIST_FILE = LoLKR/Info.plist; 506 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 507 | MACOSX_DEPLOYMENT_TARGET = 10.9; 508 | PRODUCT_BUNDLE_IDENTIFIER = koo.jasesung.lolkr; 509 | PRODUCT_NAME = "롤 한국 서버 패치"; 510 | SDKROOT = macosx; 511 | }; 512 | name = Debug; 513 | }; 514 | B67E1D751AC68578003FA730 /* Release */ = { 515 | isa = XCBuildConfiguration; 516 | baseConfigurationReference = 450107DDDFF60139139CA600 /* Pods.release.xcconfig */; 517 | buildSettings = { 518 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 519 | CODE_SIGN_IDENTITY = "Mac Developer"; 520 | COMBINE_HIDPI_IMAGES = YES; 521 | FRAMEWORK_SEARCH_PATHS = ( 522 | "$(inherited)", 523 | "$(PROJECT_DIR)/Pods/Sparkle", 524 | ); 525 | INFOPLIST_FILE = LoLKR/Info.plist; 526 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 527 | MACOSX_DEPLOYMENT_TARGET = 10.9; 528 | PRODUCT_BUNDLE_IDENTIFIER = koo.jasesung.lolkr; 529 | PRODUCT_NAME = "롤 한국 서버 패치"; 530 | SDKROOT = macosx; 531 | }; 532 | name = Release; 533 | }; 534 | B67E1D771AC68578003FA730 /* Debug */ = { 535 | isa = XCBuildConfiguration; 536 | buildSettings = { 537 | BUNDLE_LOADER = "$(TEST_HOST)"; 538 | COMBINE_HIDPI_IMAGES = YES; 539 | FRAMEWORK_SEARCH_PATHS = ( 540 | "$(DEVELOPER_FRAMEWORKS_DIR)", 541 | "$(inherited)", 542 | ); 543 | GCC_PREPROCESSOR_DEFINITIONS = ( 544 | "DEBUG=1", 545 | "$(inherited)", 546 | ); 547 | INFOPLIST_FILE = LoLKRTests/Info.plist; 548 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 549 | MACOSX_DEPLOYMENT_TARGET = 10.9; 550 | PRODUCT_BUNDLE_IDENTIFIER = "koo.jasesung.$(PRODUCT_NAME:rfc1034identifier)"; 551 | PRODUCT_NAME = "$(TARGET_NAME)"; 552 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/롤 한국 서버 패치.app/Contents/MacOS/롤 한국 서버 패치"; 553 | }; 554 | name = Debug; 555 | }; 556 | B67E1D781AC68578003FA730 /* Release */ = { 557 | isa = XCBuildConfiguration; 558 | buildSettings = { 559 | BUNDLE_LOADER = "$(TEST_HOST)"; 560 | COMBINE_HIDPI_IMAGES = YES; 561 | FRAMEWORK_SEARCH_PATHS = ( 562 | "$(DEVELOPER_FRAMEWORKS_DIR)", 563 | "$(inherited)", 564 | ); 565 | INFOPLIST_FILE = LoLKRTests/Info.plist; 566 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 567 | MACOSX_DEPLOYMENT_TARGET = 10.9; 568 | PRODUCT_BUNDLE_IDENTIFIER = "koo.jasesung.$(PRODUCT_NAME:rfc1034identifier)"; 569 | PRODUCT_NAME = "$(TARGET_NAME)"; 570 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/롤 한국 서버 패치.app/Contents/MacOS/롤 한국 서버 패치"; 571 | }; 572 | name = Release; 573 | }; 574 | /* End XCBuildConfiguration section */ 575 | 576 | /* Begin XCConfigurationList section */ 577 | B67E1D4E1AC68578003FA730 /* Build configuration list for PBXProject "LoLKR" */ = { 578 | isa = XCConfigurationList; 579 | buildConfigurations = ( 580 | B67E1D711AC68578003FA730 /* Debug */, 581 | B67E1D721AC68578003FA730 /* Release */, 582 | ); 583 | defaultConfigurationIsVisible = 0; 584 | defaultConfigurationName = Release; 585 | }; 586 | B67E1D731AC68578003FA730 /* Build configuration list for PBXNativeTarget "LoLKR" */ = { 587 | isa = XCConfigurationList; 588 | buildConfigurations = ( 589 | B67E1D741AC68578003FA730 /* Debug */, 590 | B67E1D751AC68578003FA730 /* Release */, 591 | ); 592 | defaultConfigurationIsVisible = 0; 593 | defaultConfigurationName = Release; 594 | }; 595 | B67E1D761AC68578003FA730 /* Build configuration list for PBXNativeTarget "LoLKRTests" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | B67E1D771AC68578003FA730 /* Debug */, 599 | B67E1D781AC68578003FA730 /* Release */, 600 | ); 601 | defaultConfigurationIsVisible = 0; 602 | defaultConfigurationName = Release; 603 | }; 604 | /* End XCConfigurationList section */ 605 | }; 606 | rootObject = B67E1D4B1AC68578003FA730 /* Project object */; 607 | } 608 | -------------------------------------------------------------------------------- /LoLKR/Main.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 82 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | app 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 358 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | --------------------------------------------------------------------------------