1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Watch/Bridge/TGBridgeUser.m
2015-10-01 19:19:52 +03:00

274 lines
10 KiB
Objective-C

#import "TGBridgeUser.h"
#import "TGBridgeBotInfo.h"
#import "TGStringUtils.h"
NSString *const TGBridgeUserIdentifierKey = @"identifier";
NSString *const TGBridgeUserFirstNameKey = @"firstName";
NSString *const TGBridgeUserLastNameKey = @"lastName";
NSString *const TGBridgeUserUserNameKey = @"userName";
NSString *const TGBridgeUserPhoneNumberKey = @"phoneNumber";
NSString *const TGBridgeUserPrettyPhoneNumberKey = @"prettyPhoneNumber";
NSString *const TGBridgeUserOnlineKey = @"online";
NSString *const TGBridgeUserLastSeenKey = @"lastSeen";
NSString *const TGBridgeUserPhotoSmallKey = @"photoSmall";
NSString *const TGBridgeUserPhotoBigKey = @"photoBig";
NSString *const TGBridgeUserKindKey = @"kind";
NSString *const TGBridgeUserBotKindKey = @"botKind";
NSString *const TGBridgeUserBotVersionKey = @"botVersion";
NSString *const TGBridgeUserVersionKey = @"version";
NSString *const TGBridgeUsersDictionaryKey = @"users";
@implementation TGBridgeUser
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self != nil)
{
_identifier = [aDecoder decodeInt32ForKey:TGBridgeUserIdentifierKey];
_firstName = [aDecoder decodeObjectForKey:TGBridgeUserFirstNameKey];
_lastName = [aDecoder decodeObjectForKey:TGBridgeUserLastNameKey];
_userName = [aDecoder decodeObjectForKey:TGBridgeUserUserNameKey];
_phoneNumber = [aDecoder decodeObjectForKey:TGBridgeUserPhoneNumberKey];
_prettyPhoneNumber = [aDecoder decodeObjectForKey:TGBridgeUserPrettyPhoneNumberKey];
_online = [aDecoder decodeBoolForKey:TGBridgeUserOnlineKey];
_lastSeen = [aDecoder decodeDoubleForKey:TGBridgeUserLastSeenKey];
_photoSmall = [aDecoder decodeObjectForKey:TGBridgeUserPhotoSmallKey];
_photoBig = [aDecoder decodeObjectForKey:TGBridgeUserPhotoBigKey];
_kind = [aDecoder decodeInt32ForKey:TGBridgeUserKindKey];
_botKind = [aDecoder decodeInt32ForKey:TGBridgeUserBotKindKey];
_botVersion = [aDecoder decodeInt32ForKey:TGBridgeUserBotVersionKey];
_userVersion = [aDecoder decodeInt32ForKey:TGBridgeUserVersionKey];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt32:self.identifier forKey:TGBridgeUserIdentifierKey];
[aCoder encodeObject:self.firstName forKey:TGBridgeUserFirstNameKey];
[aCoder encodeObject:self.lastName forKey:TGBridgeUserLastNameKey];
[aCoder encodeObject:self.userName forKey:TGBridgeUserUserNameKey];
[aCoder encodeObject:self.phoneNumber forKey:TGBridgeUserPhoneNumberKey];
[aCoder encodeObject:self.prettyPhoneNumber forKey:TGBridgeUserPrettyPhoneNumberKey];
[aCoder encodeBool:self.online forKey:TGBridgeUserOnlineKey];
[aCoder encodeDouble:self.lastSeen forKey:TGBridgeUserLastSeenKey];
[aCoder encodeObject:self.photoSmall forKey:TGBridgeUserPhotoSmallKey];
[aCoder encodeObject:self.photoBig forKey:TGBridgeUserPhotoBigKey];
[aCoder encodeInt32:self.kind forKey:TGBridgeUserKindKey];
[aCoder encodeInt32:self.botKind forKey:TGBridgeUserBotKindKey];
[aCoder encodeInt32:self.botVersion forKey:TGBridgeUserBotVersionKey];
[aCoder encodeInt32:self.userVersion forKey:TGBridgeUserVersionKey];
}
- (instancetype)copyWithZone:(NSZone *)__unused zone
{
TGBridgeUser *user = [[TGBridgeUser alloc] init];
user->_identifier = self.identifier;
user->_firstName = self.firstName;
user->_lastName = self.lastName;
user->_userName = self.userName;
user->_phoneNumber = self.phoneNumber;
user->_prettyPhoneNumber = self.prettyPhoneNumber;
user->_online = self.isOnline;
user->_lastSeen = self.lastSeen;
user->_photoSmall = self.photoSmall;
user->_photoBig = self.photoBig;
user->_kind = self.kind;
user->_botKind = self.botKind;
user->_botVersion = self.botVersion;
user->_userVersion = self.userVersion;
return user;
}
- (NSString *)displayName
{
NSString *firstName = self.firstName;
NSString *lastName = self.lastName;
if (firstName != nil && firstName.length != 0 && lastName != nil && lastName.length != 0)
{
if (TGIsKorean())
return [[NSString alloc] initWithFormat:@"%@ %@", lastName, firstName];
else
return [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName];
}
else if (firstName != nil && firstName.length != 0)
return firstName;
else if (lastName != nil && lastName.length != 0)
return lastName;
return @"";
}
- (bool)isBot
{
return (self.kind == TGBridgeUserKindBot || self.kind ==TGBridgeUserKindSmartBot);
}
- (TGBridgeUserChange *)changeFromUser:(TGBridgeUser *)user
{
NSMutableDictionary *fields = [[NSMutableDictionary alloc] init];
[self _compareString:self.firstName oldString:user.firstName dict:fields key:TGBridgeUserFirstNameKey];
[self _compareString:self.lastName oldString:user.lastName dict:fields key:TGBridgeUserLastNameKey];
[self _compareString:self.userName oldString:user.userName dict:fields key:TGBridgeUserUserNameKey];
[self _compareString:self.phoneNumber oldString:user.phoneNumber dict:fields key:TGBridgeUserPhoneNumberKey];
[self _compareString:self.prettyPhoneNumber oldString:user.prettyPhoneNumber dict:fields key:TGBridgeUserPrettyPhoneNumberKey];
if (self.isOnline != user.isOnline)
fields[TGBridgeUserOnlineKey] = @(self.isOnline);
if (fabs(self.lastSeen - user.lastSeen) > DBL_EPSILON)
fields[TGBridgeUserLastSeenKey] = @(self.lastSeen);
[self _compareString:self.photoSmall oldString:user.photoSmall dict:fields key:TGBridgeUserPhotoSmallKey];
[self _compareString:self.photoBig oldString:user.photoBig dict:fields key:TGBridgeUserPhotoBigKey];
if (self.kind != user.kind)
fields[TGBridgeUserKindKey] = @(self.kind);
if (self.botKind != user.botKind)
fields[TGBridgeUserBotKindKey] = @(self.botKind);
if (self.botVersion != user.botVersion)
fields[TGBridgeUserBotVersionKey] = @(self.botVersion);
if (fields.count == 0)
return nil;
return [[TGBridgeUserChange alloc] initWithUserIdentifier:user.identifier fields:fields];
}
- (void)_compareString:(NSString *)newString oldString:(NSString *)oldString dict:(NSMutableDictionary *)dict key:(NSString *)key
{
if (newString == nil && oldString == nil)
return;
if (![newString isEqualToString:oldString])
{
if (newString == nil)
dict[key] = [NSNull null];
else
dict[key] = newString;
}
}
- (TGBridgeUser *)userByApplyingChange:(TGBridgeUserChange *)change
{
if (change.userIdentifier != self.identifier)
return nil;
TGBridgeUser *user = [self copy];
NSString *firstNameChange = change.fields[TGBridgeUserFirstNameKey];
if (firstNameChange != nil)
user->_firstName = [self _stringForFieldChange:firstNameChange];
NSString *lastNameChange = change.fields[TGBridgeUserLastNameKey];
if (lastNameChange != nil)
user->_lastName = [self _stringForFieldChange:lastNameChange];
NSString *userNameChange = change.fields[TGBridgeUserUserNameKey];
if (userNameChange != nil)
user->_userName = [self _stringForFieldChange:userNameChange];
NSString *phoneNumberChange = change.fields[TGBridgeUserPhoneNumberKey];
if (phoneNumberChange != nil)
user->_phoneNumber = [self _stringForFieldChange:phoneNumberChange];
NSString *prettyPhoneNumberChange = change.fields[TGBridgeUserPrettyPhoneNumberKey];
if (prettyPhoneNumberChange != nil)
user->_prettyPhoneNumber = [self _stringForFieldChange:prettyPhoneNumberChange];
NSNumber *onlineChange = change.fields[TGBridgeUserOnlineKey];
if (onlineChange != nil)
user->_online = [onlineChange boolValue];
NSNumber *lastSeenChange = change.fields[TGBridgeUserLastSeenKey];
if (lastSeenChange != nil)
user->_lastSeen = [lastSeenChange doubleValue];
NSString *photoSmallChange = change.fields[TGBridgeUserPhotoSmallKey];
if (photoSmallChange != nil)
user->_photoSmall = [self _stringForFieldChange:photoSmallChange];
NSString *photoBigChange = change.fields[TGBridgeUserPhotoBigKey];
if (photoBigChange != nil)
user->_photoBig = [self _stringForFieldChange:photoBigChange];
NSNumber *kindChange = change.fields[TGBridgeUserKindKey];
if (kindChange != nil)
user->_kind = [kindChange int32Value];
NSNumber *botKindChange = change.fields[TGBridgeUserBotKindKey];
if (botKindChange != nil)
user->_botKind = [botKindChange int32Value];
NSNumber *botVersionChange = change.fields[TGBridgeUserBotVersionKey];
if (botVersionChange != nil)
user->_botVersion = [botVersionChange int32Value];
return user;
}
- (NSString *)_stringForFieldChange:(NSString *)fieldChange
{
if ([fieldChange isKindOfClass:[NSNull class]])
return nil;
return fieldChange;
}
- (BOOL)isEqual:(id)object
{
if (object == self)
return YES;
if (!object || ![object isKindOfClass:[self class]])
return NO;
return self.identifier == ((TGBridgeUser *)object).identifier;
}
@end
NSString *const TGBridgeUserChangeIdentifierKey = @"userIdentifier";
NSString *const TGBridgeUserChangeFieldsKey = @"fields";
@implementation TGBridgeUserChange
- (instancetype)initWithUserIdentifier:(int32_t)userIdentifier fields:(NSDictionary *)fields
{
self = [super init];
if (self != nil)
{
_userIdentifier = userIdentifier;
_fields = fields;
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self != nil)
{
_userIdentifier = [aDecoder decodeInt32ForKey:TGBridgeUserChangeIdentifierKey];
_fields = [aDecoder decodeObjectForKey:TGBridgeUserChangeFieldsKey];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt32:self.userIdentifier forKey:TGBridgeUserChangeIdentifierKey];
[aCoder encodeObject:self.fields forKey:TGBridgeUserChangeFieldsKey];
}
@end