1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-03 09:57:46 +01:00
Telegram/Telegraph/TGUser+Telegraph.m
2016-02-25 01:03:51 +01:00

196 lines
7.0 KiB
Objective-C

#import "TGUser+Telegraph.h"
#import "TGSchema.h"
#import "TGDatabase.h"
#import "TGTelegraph.h"
#import "TGImageInfo+Telegraph.h"
#import "TGStringUtils.h"
#import "TLUser$modernUser.h"
void extractUserPhoto(TLUserProfilePhoto *photo, TGUser *target)
{
if ([photo isKindOfClass:[TLUserProfilePhoto$userProfilePhoto class]])
{
TLUserProfilePhoto$userProfilePhoto *profilePhoto = (TLUserProfilePhoto$userProfilePhoto *)photo;
target.photoUrlSmall = extractFileUrl(profilePhoto.photo_small);
target.photoUrlMedium = nil;
target.photoUrlBig = extractFileUrl(profilePhoto.photo_big);
}
else
{
target.photoUrlSmall = nil;
target.photoUrlMedium = nil;
target.photoUrlBig = nil;
}
}
TGUserPresence extractUserPresence(TLUserStatus *status)
{
if ([status isKindOfClass:[TLUserStatus$userStatusOnline class]])
{
TGUserPresence presence;
presence.online = true;
presence.lastSeen = ((TLUserStatus$userStatusOnline *)status).expires;
presence.temporaryLastSeen = 0;
return presence;
}
else if ([status isKindOfClass:[TLUserStatus$userStatusOffline class]])
{
TGUserPresence presence;
presence.online = false;
presence.lastSeen = ((TLUserStatus$userStatusOffline *)status).was_online;
presence.temporaryLastSeen = 0;
return presence;
}
else if ([status isKindOfClass:[TLUserStatus$userStatusRecently class]])
{
TGUserPresence presence;
presence.online = false;
presence.lastSeen = TGUserPresenceValueLately;
presence.temporaryLastSeen = 0;
return presence;
}
else if ([status isKindOfClass:[TLUserStatus$userStatusLastWeek class]])
{
TGUserPresence presence;
presence.online = false;
presence.lastSeen = TGUserPresenceValueWithinAWeek;
presence.temporaryLastSeen = 0;
return presence;
}
else if ([status isKindOfClass:[TLUserStatus$userStatusLastMonth class]])
{
TGUserPresence presence;
presence.online = false;
presence.lastSeen = TGUserPresenceValueWithinAMonth;
presence.temporaryLastSeen = 0;
return presence;
}
else
{
TGUserPresence presence;
presence.online = false;
presence.lastSeen = TGUserPresenceValueALongTimeAgo;
presence.temporaryLastSeen = 0;
return presence;
}
}
int extractUserLink(TLcontacts_Link *link)
{
int value = 0;
if ([link.my_link isKindOfClass:[TLContactLink$contactLinkContact class]])
value |= TGUserLinkMyContact | TGUserLinkKnown;
else if ([link.my_link isKindOfClass:[TLContactLink$contactLinkHasPhone class]])
value |= TGUserLinkForeignHasPhone | TGUserLinkKnown;
else if ([link.my_link isKindOfClass:[TLContactLink$contactLinkNone class]])
value |= TGUserLinkKnown;
if ([link.foreign_link isKindOfClass:[TLContactLink$contactLinkContact class]])
value |= TGUserLinkForeignHasPhone | TGUserLinkKnown;
else if ([link.foreign_link isKindOfClass:[TLContactLink$contactLinkHasPhone class]])
value |= TGUserLinkForeignHasPhone | TGUserLinkKnown;
else if ([link.foreign_link isKindOfClass:[TLContactLink$contactLinkNone class]])
value |= TGUserLinkKnown;
return value;
}
int extractUserLinkFromUpdate(TLUpdate$updateContactLink *linkUpdate)
{
int value = 0;
if ([linkUpdate.my_link isKindOfClass:[TLContactLink$contactLinkContact class]])
value |= TGUserLinkMyContact | TGUserLinkKnown;
else if ([linkUpdate.my_link isKindOfClass:[TLContactLink$contactLinkHasPhone class]])
value |= TGUserLinkForeignHasPhone | TGUserLinkKnown;
else if ([linkUpdate.my_link isKindOfClass:[TLContactLink$contactLinkNone class]])
value |= TGUserLinkKnown;
if ([linkUpdate.foreign_link isKindOfClass:[TLContactLink$contactLinkContact class]])
value |= TGUserLinkForeignHasPhone | TGUserLinkKnown;
else if ([linkUpdate.foreign_link isKindOfClass:[TLContactLink$contactLinkHasPhone class]])
value |= TGUserLinkForeignHasPhone | TGUserLinkKnown;
else if ([linkUpdate.foreign_link isKindOfClass:[TLContactLink$contactLinkNone class]])
value |= TGUserLinkKnown;
return value;
}
@implementation TGUser (Telegraph)
//user flags:# id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int = User;
- (id)initWithTelegraphUserDesc:(TLUser *)user
{
self = [super init];
if (self != nil)
{
int32_t uid = 0;
NSString *userPhone = nil;
if ([user isKindOfClass:[TLUser$modernUser class]])
{
TLUser$modernUser *concreteUser = (TLUser$modernUser *)user;
uid = concreteUser.n_id;
self.uid = uid;
self.phoneNumberHash = concreteUser.access_hash;
self.firstName = concreteUser.first_name;
self.lastName = concreteUser.last_name;
self.userName = concreteUser.username;
userPhone = concreteUser.phone;
extractUserPhoto(concreteUser.photo, self);
self.presence = extractUserPresence(concreteUser.status);
if (concreteUser.flags & (1 << 14))
self.kind = TGUserKindBot;
if (concreteUser.flags & (1 << 15))
self.kind = TGUserKindSmartBot;
self.botKind = (concreteUser.flags & (1 << 16)) ? TGBotKindPrivate : TGBotKindGeneric;
self.botInfoVersion = concreteUser.bot_info_version;
self.isVerified = concreteUser.flags & (1 << 17);
self.hasExplicitContent = concreteUser.flags & (1 << 18);
self.restrictionReason = concreteUser.restriction_reason;
self.contextBotPlaceholder = concreteUser.inlineBotPlaceholder;
self.isContextBot = concreteUser.flags & (1 << 19);
self.minimalRepresentation = concreteUser.flags & (1 << 20);
}
else if ([user isKindOfClass:[TLUser$userEmpty class]])
{
uid = ((TLUser$userEmpty *)user).n_id;
self.minimalRepresentation = true;
}
if (userPhone.length != 0)
{
if (![userPhone hasPrefix:@"+"])
userPhone = [[NSString alloc] initWithFormat:@"+%@", userPhone];
self.phoneNumber = userPhone;
}
if (uid != 0 && userPhone.length != 0)
{
TGContactBinding *binding = [TGDatabaseInstance() contactBindingWithId:self.contactId];
if (binding != nil)
{
if (uid != TGTelegraphInstance.clientUserId)
{
self.phonebookFirstName = binding.firstName;
self.phonebookLastName = binding.lastName;
}
}
}
}
return self;
}
@end