PageRenderTime 26ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/Shared/Additions/MVChatConnectionAdditions.m

https://github.com/HHRy/Colloquy
Objective C | 298 lines | 220 code | 77 blank | 1 comment | 61 complexity | 7e0562332f70cf3e4c91b62a4005cbf1 MD5 | raw file
  1. #import "MVChatConnectionAdditions.h"
  2. #import "CQKeychain.h"
  3. #if SYSTEM(IOS)
  4. #import "CQBouncerSettings.h"
  5. #endif
  6. @implementation MVChatConnection (MVChatConnectionAdditions)
  7. + (NSString *) defaultNickname {
  8. NSString *defaultNickname = [[NSUserDefaults standardUserDefaults] stringForKey:@"CQDefaultNickname"];
  9. if (defaultNickname.length)
  10. return defaultNickname;
  11. #if SYSTEM(MAC) || SYSTEM(IOS_SIMULATOR)
  12. return NSUserName();
  13. #elif SYSTEM(IOS)
  14. static NSString *generatedNickname;
  15. if (!generatedNickname) {
  16. NSCharacterSet *badCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"] invertedSet];
  17. NSArray *components = [[UIDevice currentDevice].name componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
  18. for (NSString *compontent in components) {
  19. if ([compontent isCaseInsensitiveEqualToString:@"iPhone"] || [compontent isCaseInsensitiveEqualToString:@"iPod"] || [compontent isCaseInsensitiveEqualToString:@"iPad"])
  20. continue;
  21. if ([compontent isEqualToString:@"3G"] || [compontent isEqualToString:@"3GS"] || [compontent isEqualToString:@"S"] || [compontent isCaseInsensitiveEqualToString:@"Touch"])
  22. continue;
  23. if ([compontent hasCaseInsensitiveSuffix:@"'s"])
  24. compontent = [compontent substringWithRange:NSMakeRange(0, (compontent.length - 2))];
  25. if (!compontent.length)
  26. continue;
  27. generatedNickname = [[compontent stringByReplacingCharactersInSet:badCharacters withString:@""] copy];
  28. break;
  29. }
  30. }
  31. if (generatedNickname.length)
  32. return generatedNickname;
  33. #endif
  34. return NSLocalizedString(@"ColloquyUser", @"Default nickname");
  35. }
  36. + (NSString *) defaultRealName {
  37. NSString *defaultRealName = [[NSUserDefaults standardUserDefaults] stringForKey:@"CQDefaultRealName"];
  38. if (defaultRealName.length)
  39. return defaultRealName;
  40. #if SYSTEM(MAC) || SYSTEM(IOS_SIMULATOR)
  41. return NSFullUserName();
  42. #elif SYSTEM(IOS)
  43. static NSString *generatedRealName;
  44. if (!generatedRealName) {
  45. // This might only work for English users, but it is fine for now.
  46. NSString *deviceName = [UIDevice currentDevice].name;
  47. NSRange range = [deviceName rangeOfString:@"'s" options:NSLiteralSearch];
  48. if (range.location != NSNotFound)
  49. generatedRealName = [[deviceName substringToIndex:range.location] copy];
  50. }
  51. if (generatedRealName.length)
  52. return generatedRealName;
  53. #endif
  54. return NSLocalizedString(@"Colloquy User", @"Default real name");
  55. }
  56. + (NSString *) defaultUsernameWithNickname:(NSString *) nickname {
  57. NSCharacterSet *badCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"] invertedSet];
  58. NSString *username = [[nickname lowercaseString] stringByReplacingCharactersInSet:badCharacters withString:@""];
  59. if (username.length)
  60. return username;
  61. #if SYSTEM(IOS)
  62. return @"mobile";
  63. #else
  64. return @"user";
  65. #endif
  66. }
  67. + (NSString *) defaultQuitMessage {
  68. return [[NSUserDefaults standardUserDefaults] stringForKey:@"JVQuitMessage"];
  69. }
  70. + (NSStringEncoding) defaultEncoding {
  71. return [[NSUserDefaults standardUserDefaults] integerForKey:@"JVChatEncoding"];
  72. }
  73. #pragma mark -
  74. - (void) setDisplayName:(NSString *) name {
  75. NSParameterAssert(name != nil);
  76. if ([name isEqualToString:self.displayName])
  77. return;
  78. [self setPersistentInformationObject:name forKey:@"description"];
  79. }
  80. - (NSString *) displayName {
  81. NSString *name = [self persistentInformationObjectForKey:@"description"];
  82. if (!name.length)
  83. return self.server;
  84. return name;
  85. }
  86. #pragma mark -
  87. - (void) joinChatRoomNamed:(NSString *) room {
  88. room = [self properNameForChatRoomNamed:room];
  89. NSString *password = [[CQKeychain standardKeychain] passwordForServer:self.uniqueIdentifier area:room];
  90. [self joinChatRoomNamed:room withPassphrase:password];
  91. }
  92. #pragma mark -
  93. - (void) setAutomaticJoinedRooms:(NSArray *) rooms {
  94. NSParameterAssert(rooms != nil);
  95. [self setPersistentInformationObject:rooms forKey:@"rooms"];
  96. }
  97. - (NSArray *) automaticJoinedRooms {
  98. return [self persistentInformationObjectForKey:@"rooms"];
  99. }
  100. #pragma mark -
  101. - (void) setAutomaticCommands:(NSArray *) commands {
  102. NSParameterAssert(commands != nil);
  103. [self setPersistentInformationObject:commands forKey:@"commands"];
  104. }
  105. - (NSArray *) automaticCommands {
  106. return [self persistentInformationObjectForKey:@"commands"];
  107. }
  108. #pragma mark -
  109. - (void) setAutomaticallyConnect:(BOOL) autoConnect {
  110. if (autoConnect == self.automaticallyConnect)
  111. return;
  112. [self setPersistentInformationObject:[NSNumber numberWithBool:autoConnect] forKey:@"automatic"];
  113. }
  114. - (BOOL) automaticallyConnect {
  115. return [[self persistentInformationObjectForKey:@"automatic"] boolValue];
  116. }
  117. #pragma mark -
  118. - (void) savePasswordsToKeychain {
  119. [[CQKeychain standardKeychain] setPassword:self.nicknamePassword forServer:self.uniqueIdentifier area:[NSString stringWithFormat:@"Nickname %@", self.preferredNickname]];
  120. [[CQKeychain standardKeychain] setPassword:self.password forServer:self.uniqueIdentifier area:@"Server"];
  121. }
  122. - (void) loadPasswordsFromKeychain {
  123. NSString *password = nil;
  124. if ((password = [[CQKeychain standardKeychain] passwordForServer:self.uniqueIdentifier area:[NSString stringWithFormat:@"Nickname %@", self.preferredNickname]]) && password.length)
  125. self.nicknamePassword = password;
  126. if ((password = [[CQKeychain standardKeychain] passwordForServer:self.uniqueIdentifier area:@"Server"]) && password.length)
  127. self.password = password;
  128. }
  129. #pragma mark -
  130. #if SYSTEM(IOS)
  131. - (void) setMultitaskingSupported:(BOOL) multitaskingSupported {
  132. if (multitaskingSupported == self.multitaskingSupported)
  133. return;
  134. [self setPersistentInformationObject:[NSNumber numberWithBool:multitaskingSupported] forKey:@"multitasking"];
  135. }
  136. - (BOOL) multitaskingSupported {
  137. return [[self persistentInformationObjectForKey:@"multitasking"] boolValue];
  138. }
  139. #pragma mark -
  140. - (void) setPushNotificationsEnabled:(BOOL) push {
  141. if (push == self.pushNotificationsEnabled)
  142. return;
  143. [self setPersistentInformationObject:[NSNumber numberWithBool:push] forKey:@"push"];
  144. [self sendPushNotificationCommands];
  145. }
  146. - (BOOL) pushNotificationsEnabled {
  147. return [[self persistentInformationObjectForKey:@"push"] boolValue];
  148. }
  149. #pragma mark -
  150. - (BOOL) isTemporaryDirectConnection {
  151. return [[self persistentInformationObjectForKey:@"direct"] boolValue];
  152. }
  153. - (void) setTemporaryDirectConnection:(BOOL) direct {
  154. if (direct == self.temporaryDirectConnection)
  155. return;
  156. [self setPersistentInformationObject:[NSNumber numberWithBool:direct] forKey:@"direct"];
  157. }
  158. - (BOOL) isDirectConnection {
  159. return (self.bouncerType == MVChatConnectionNoBouncer);
  160. }
  161. #pragma mark -
  162. - (void) setBouncerSettings:(CQBouncerSettings *) settings {
  163. self.bouncerIdentifier = settings.identifier;
  164. }
  165. - (CQBouncerSettings *) bouncerSettings {
  166. return [[CQConnectionsController defaultController] bouncerSettingsForIdentifier:self.bouncerIdentifier];
  167. }
  168. #pragma mark -
  169. - (void) setBouncerIdentifier:(NSString *) identifier {
  170. if ([identifier isEqualToString:self.bouncerIdentifier])
  171. return;
  172. if (identifier.length)
  173. [self setPersistentInformationObject:identifier forKey:@"bouncerIdentifier"];
  174. else [self removePersistentInformationObjectForKey:@"bouncerIdentifier"];
  175. }
  176. - (NSString *) bouncerIdentifier {
  177. return [self persistentInformationObjectForKey:@"bouncerIdentifier"];
  178. }
  179. #pragma mark -
  180. - (void) connectAppropriately {
  181. [self setPersistentInformationObject:[NSNumber numberWithBool:YES] forKey:@"tryBouncerFirst"];
  182. [self connect];
  183. }
  184. - (void) connectDirectly {
  185. [self removePersistentInformationObjectForKey:@"tryBouncerFirst"];
  186. self.temporaryDirectConnection = YES;
  187. [self connect];
  188. }
  189. #pragma mark -
  190. - (void) sendPushNotificationCommands {
  191. if (!self.connected && self.status != MVChatConnectionConnectingStatus)
  192. return;
  193. NSString *deviceToken = [CQColloquyApplication sharedApplication].deviceToken;
  194. if (!deviceToken.length)
  195. return;
  196. NSNumber *currentState = [self persistentInformationObjectForKey:@"pushState"];
  197. CQBouncerSettings *settings = self.bouncerSettings;
  198. if ((!settings || settings.pushNotifications) && self.pushNotifications && (!currentState || ![currentState boolValue])) {
  199. [self setPersistentInformationObject:[NSNumber numberWithBool:YES] forKey:@"pushState"];
  200. [self sendRawMessageWithFormat:@"PUSH add-device %@ :%@", deviceToken, [UIDevice currentDevice].name];
  201. [self sendRawMessage:@"PUSH service colloquy.mobi 7906"];
  202. [self sendRawMessageWithFormat:@"PUSH connection %@ :%@", self.uniqueIdentifier, self.displayName];
  203. NSArray *highlightWords = [CQColloquyApplication sharedApplication].highlightWords;
  204. for (NSString *highlightWord in highlightWords)
  205. [self sendRawMessageWithFormat:@"PUSH highlight-word :%@", highlightWord];
  206. NSString *sound = [[NSUserDefaults standardUserDefaults] stringForKey:@"CQSoundOnHighlight"];
  207. if (sound.length && ![sound isEqualToString:@"None"])
  208. [self sendRawMessageWithFormat:@"PUSH highlight-sound :%@.aiff", sound];
  209. else [self sendRawMessageWithFormat:@"PUSH highlight-sound none"];
  210. sound = [[NSUserDefaults standardUserDefaults] stringForKey:@"CQSoundOnPrivateMessage"];
  211. if (sound.length && ![sound isEqualToString:@"None"])
  212. [self sendRawMessageWithFormat:@"PUSH message-sound :%@.aiff", sound];
  213. else [self sendRawMessageWithFormat:@"PUSH message-sound none"];
  214. [self sendRawMessage:@"PUSH end-device"];
  215. } else if ((!currentState || [currentState boolValue])) {
  216. [self setPersistentInformationObject:[NSNumber numberWithBool:NO] forKey:@"pushState"];
  217. [self sendRawMessageWithFormat:@"PUSH remove-device :%@", deviceToken];
  218. }
  219. }
  220. #endif // SYSTEM(IOS)
  221. @end