00001
00002
00003
00004
00005
00006
00007
00008
00009 #import "LoginController.h"
00010
00011
00012 @implementation LoginController
00013
00014 bool makeNewPassword = NO;
00015 bool clockRunning = NO;
00016 bool multiThreaded = NO;
00017
00018
00019 - (id) init {
00020 self = [super init];
00021 if (self != nil) {
00022 loginManager = [[LoginManager alloc] init];
00023 }
00024 return self;
00025 }
00026
00027 - (void) awakeFromNib {
00028
00029
00030 [playerName setStringValue:NSUserName()];
00031
00032
00033
00034
00035
00036 [[NSNotificationCenter defaultCenter] addObserver:self
00037 selector:@selector(loginDidEndEditing:)
00038 name:@"NSControlTextDidEndEditingNotification"
00039 object:playerName];
00040
00041 [[NSNotificationCenter defaultCenter] addObserver:self
00042 selector:@selector(passwordDidEndEditing:)
00043 name:@"NSControlTextDidEndEditingNotification"
00044 object:playerPassword];
00045
00046 [[NSNotificationCenter defaultCenter] addObserver:self
00047 selector:@selector(passwordVerifyDidEndEditing:)
00048 name:@"NSControlTextDidEndEditingNotification"
00049 object:playerPasswordVerify];
00050
00051
00052
00053 [notificationCenter addObserver:self selector:@selector(invalidServer:)
00054 name:@"LM_LOGIN_INVALID_SERVER" object:nil useLocks:NO useMainRunLoop:YES];
00055 [notificationCenter addObserver:self selector:@selector(getPassword:)
00056 name:@"LM_LOGIN_GET_PASSWORD" object:nil useLocks:NO useMainRunLoop:YES];
00057 [notificationCenter addObserver:self selector:@selector(loginComplete:)
00058 name:@"LM_LOGIN_COMPLETE" object:nil useLocks:NO useMainRunLoop:YES];
00059 [notificationCenter addObserver:self selector:@selector(makePassword:)
00060 name:@"LM_LOGIN_MAKE_PASSWORD" object:nil useLocks:NO useMainRunLoop:YES];
00061 [notificationCenter addObserver:self selector:@selector(badLogin:)
00062 name:@"LM_LOGIN_BAD_PASSWORD" object:nil useLocks:NO useMainRunLoop:YES];
00063
00064 }
00065
00066 - (void) setMultiThreaded:(bool)multi {
00067 multiThreaded = multi;
00068 }
00069
00070
00071 - (void) reset {
00072 [loginManager reset];
00073 [playerPassword setStringValue:@""];
00074 [playerPasswordVerify setStringValue:@""];
00075 }
00076
00077 - (void) enablePlayerName {
00078 [outfitButton setEnabled:NO];
00079
00080 [loginInstruction setStringValue:@"Enter your name. Use the name 'guest' to remain anonymous."];
00081 [playerName setEnabled:YES];
00082 }
00083
00084 - (void) disablePlayerName {
00085
00086 [loginInstruction setStringValue:@"Please select a server before playing."];
00087 [playerName setEnabled:NO];
00088 [outfitButton setEnabled:NO];
00089 }
00090
00091
00092 - (void) invalidServer:(id)sender {
00093 [loginInstruction setStringValue:@"Sorry, this client is incompatible with Paradise servers."];
00094
00095 [notificationCenter postNotificationName:@"LC_INVALID_SERVER"];
00096 [playerName setEnabled:NO];
00097 [outfitButton setEnabled:NO];
00098 }
00099
00100 - (void) getPassword:(id)sender {
00101
00102 [loginInstruction setStringValue:@"Name known, enter your password:"];
00103 [playerPassword setEnabled:YES];
00104 [playerPassword selectText:self];
00105 makeNewPassword = NO;
00106 [outfitButton setEnabled:NO];
00107 }
00108
00109 - (void) loginComplete:(id)sender {
00110 NSLog(@"LoginController.loginComplete reached");
00111 [loginInstruction setStringValue:@"Welcome!"];
00112 [notificationCenter postNotificationName:@"LC_LOGIN_COMPLETE"];
00113 [outfitButton setEnabled:YES];
00114 }
00115
00116 - (void) makePassword:(id)sender {
00117
00118 [loginInstruction setStringValue:@"Name unknown, you need to make a password:"];
00119 [playerPassword setEnabled:YES];
00120 [playerPassword selectText:self];
00121 makeNewPassword = YES;
00122 [outfitButton setEnabled:NO];
00123 }
00124
00125 - (void) badLogin:(id)sender {
00126 [loginInstruction setStringValue:@"Bad password!"];
00127 [playerPassword setEnabled:NO];
00128 [playerName setEnabled:YES];
00129 [playerName selectText:self];
00130 [outfitButton setEnabled:NO];
00131 }
00132
00133
00134 - (void)passwordDidEndEditing:(NSNotification *)aNotification {
00135 NSLog(@"LoginController.passwordDidEndEditing %@", [aNotification name]);
00136
00137 if (makeNewPassword) {
00138 [loginInstruction setStringValue:@"Enter it again to make sure you typed it right."];
00139 [playerPasswordVerify setEnabled:YES];
00140 [playerPasswordVerify setHidden:NO];
00141 [playerPasswordVerify selectText:self];
00142
00143 } else {
00144 [loginManager setPassword: [playerPassword stringValue]];
00145 }
00146 [playerPassword setEnabled:NO];
00147
00148
00149
00150 if (!multiThreaded) {
00151 [notificationCenter postNotificationName:@"COMM_READ_FROM_SERVER"];
00152 }
00153 }
00154
00155 - (void)loginDidEndEditing:(NSNotification *)aNotification {
00156 NSLog(@"LoginController.loginDidEndEditing %@", [aNotification name]);
00157
00158
00159 [loginManager setName: [playerName stringValue]];
00160 [playerName setEnabled:NO];
00161
00162
00163
00164 if (!multiThreaded) {
00165
00166 while ([loginManager state] == LOGIN_GETNAME) {
00167 [notificationCenter postNotificationName:@"COMM_READ_FROM_SERVER"];
00168 }
00169
00170 if ([[[playerName stringValue] uppercaseString] isEqualToString:@"GUEST"]) {
00171
00172
00173 if ([loginManager state] == LOGIN_GETPASS) {
00174 [self passwordDidEndEditing:nil];
00175 }
00176 }
00177 }
00178
00179
00180
00181 }
00182
00183 - (void)passwordVerifyDidEndEditing:(NSNotification *)aNotification {
00184 NSLog(@"LoginController.passwordVerifyDidEndEditing %@", [aNotification name]);
00185
00186
00187 if ([[playerPassword stringValue] isEqualToString:[playerPasswordVerify stringValue]]) {
00188
00189 [playerPasswordVerify setHidden:YES];
00190
00191 [loginManager setPassword: [playerPassword stringValue]];
00192
00193
00194
00195 if (!multiThreaded) {
00196 [notificationCenter postNotificationName:@"COMM_READ_FROM_SERVER"];
00197 }
00198 } else {
00199 [loginInstruction setStringValue:@"Passwords do not match! try again"];
00200 [playerPassword setEnabled:YES];
00201 [playerPassword selectText:self];
00202 }
00203 }
00204
00205 - (void) stopClock {
00206 clockRunning = NO;
00207 }
00208
00209 - (void) tickTak {
00210
00211 if (clockRunning == NO) {
00212
00213 return;
00214 }
00215
00216
00217 [loginClock setIntValue:[loginClock intValue] - 1];
00218 if ([loginClock intValue] <= 0) {
00219 [self stopClock];
00220 [notificationCenter postNotificationName:@"LC_LOGIN_CLOCK_EXPIRED"];
00221 } else {
00222
00223 [self performSelector: @selector(tickTak) withObject: self afterDelay: 1];
00224 }
00225 }
00226
00227 - (void) startClock {
00228 if (clockRunning) {
00229 NSLog(@"LoginController.startClock clock already running");
00230 return;
00231 }
00232
00233
00234 clockRunning = YES;
00235 [loginClock setIntValue:100];
00236 [self tickTak];
00237 }
00238 @end