1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGAccountSettingsActor.mm
2016-02-25 01:03:51 +01:00

287 lines
10 KiB
Plaintext

#import "TGAccountSettingsActor.h"
#import "ActionStage.h"
#import "TGTelegramNetworking.h"
#import <MTProtoKit/MTRequest.h>
#import "TL/TLMetaScheme.h"
#import "TGAccountSettings.h"
#import "TGUserDataRequestBuilder.h"
#import "TGUpdateStateRequestBuilder.h"
#import "TGDatabase.h"
@interface TGAccountSettingsActor ()
{
bool _accountTtlReceived;
bool _privacySettingsReceived;
bool _groupsAndChannelsSettingsReceived;
TGAccountSettings *_accountSettings;
}
@end
@implementation TGAccountSettingsActor
+ (NSMutableDictionary *)accountSettingsForStateIdDict
{
static NSMutableDictionary *dict = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
dict = [[NSMutableDictionary alloc] init];
});
return dict;
}
+ (TGAccountSettings *)accountSettingsForStateId:(int)stateId
{
return [self accountSettingsForStateIdDict][@(stateId)];
}
+ (void)setAccountSettingsForStateId:(int)stateId accountSettings:(TGAccountSettings *)accountSettings
{
[self accountSettingsForStateIdDict][@(stateId)] = accountSettings;
}
+ (TGAccountSettings *)accountSettingsFotCurrentStateId
{
return [self accountSettingsForStateId:[TGUpdateStateRequestBuilder stateVersion]];
}
+ (void)setAccountSettingsForCurrentStateId:(TGAccountSettings *)accountSettings
{
[self setAccountSettingsForStateId:[TGUpdateStateRequestBuilder stateVersion] accountSettings:accountSettings];
}
+ (void)load
{
[ASActor registerActorClass:self];
}
+ (NSString *)genericPath
{
return @"/accountSettings";
}
- (void)_maybeComplete
{
if (_accountTtlReceived && _privacySettingsReceived && _groupsAndChannelsSettingsReceived)
{
[TGDatabaseInstance() setLocalUserStatusPrivacyRules:_accountSettings.notificationSettings changedLoadedUsers:^(__unused NSArray *users)
{
}];
[TGAccountSettingsActor setAccountSettingsForStateId:[TGUpdateStateRequestBuilder stateVersion] accountSettings:_accountSettings];
[ActionStageInstance() actionCompleted:self.path result:_accountSettings];
}
}
- (void)prepare:(NSDictionary *)options
{
[super prepare:options];
self.requestQueueName = @"accountSettings";
}
- (void)execute:(NSDictionary *)__unused options
{
_accountSettings = [[TGAccountSettings alloc] initWithDefaultValues];
{
MTRequest *request = [[MTRequest alloc] init];
TLRPCaccount_getAccountTTL$account_getAccountTTL *getAccountTTL = [[TLRPCaccount_getAccountTTL$account_getAccountTTL alloc] init];
request.body = getAccountTTL;
__weak TGAccountSettingsActor *weakSelf = self;
[request setCompleted:^(id result, __unused NSTimeInterval timestamp, id error)
{
__strong TGAccountSettingsActor *strongSelf = weakSelf;
if (strongSelf != nil)
{
[ActionStageInstance() dispatchOnStageQueue:^
{
if (error == nil)
[strongSelf accountTtlRequestSuccess:result];
else
[strongSelf accountTtlRequestFailed];
}];
}
}];
[[TGTelegramNetworking instance] addRequest:request];
}
{
MTRequest *request = [[MTRequest alloc] init];
TLRPCaccount_getPrivacy$account_getPrivacy *getPrivacy = [[TLRPCaccount_getPrivacy$account_getPrivacy alloc] init];
getPrivacy.key = [[TLInputPrivacyKey$inputPrivacyKeyStatusTimestamp alloc] init];
request.body = getPrivacy;
__weak TGAccountSettingsActor *weakSelf = self;
[request setCompleted:^(id result, __unused NSTimeInterval timestamp, id error)
{
__strong TGAccountSettingsActor *strongSelf = weakSelf;
if (strongSelf != nil)
{
[ActionStageInstance() dispatchOnStageQueue:^
{
if (error == nil)
[strongSelf privacySettingsRequestSuccess:result];
else
[strongSelf privacySettingsRequestFailed];
}];
}
}];
[[TGTelegramNetworking instance] addRequest:request];
}
{
MTRequest *request = [[MTRequest alloc] init];
TLRPCaccount_getPrivacy$account_getPrivacy *getPrivacy = [[TLRPCaccount_getPrivacy$account_getPrivacy alloc] init];
getPrivacy.key = [[TLInputPrivacyKey$inputPrivacyKeyChatInvite alloc] init];
request.body = getPrivacy;
__weak TGAccountSettingsActor *weakSelf = self;
[request setCompleted:^(id result, __unused NSTimeInterval timestamp, id error)
{
__strong TGAccountSettingsActor *strongSelf = weakSelf;
if (strongSelf != nil)
{
[ActionStageInstance() dispatchOnStageQueue:^
{
if (error == nil)
[strongSelf groupsAndChannelsSettingsRequestSuccess:result];
else
[strongSelf groupsAndChannelsSettingsRequestFailed];
}];
}
}];
[[TGTelegramNetworking instance] addRequest:request];
}
}
- (void)accountTtlRequestSuccess:(TLAccountDaysTTL *)accountDaysTTL
{
_accountSettings = [[TGAccountSettings alloc] initWithNotificationSettings:_accountSettings.notificationSettings groupsAndChannelsSettings:_accountSettings.groupsAndChannelsSettings accountTTLSetting:[[TGAccountTTLSetting alloc] initWithAccountTTL:@(accountDaysTTL.days * 24 * 60 * 60)]];
_accountTtlReceived = true;
[self _maybeComplete];
}
- (void)accountTtlRequestFailed
{
_accountTtlReceived = true;
[self _maybeComplete];
}
- (void)privacySettingsRequestSuccess:(TLaccount_PrivacyRules *)privacyRules
{
[TGUserDataRequestBuilder executeUserDataUpdate:privacyRules.users];
TGNotificationPrivacyAccountSetting *privacySettings = [[TGNotificationPrivacyAccountSetting alloc] initWithDefaultValues];
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingNobody];
for (TLPrivacyRule *rule in privacyRules.rules)
{
if ([rule isKindOfClass:[TLPrivacyRule$privacyValueAllowAll class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingEverybody];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueAllowContacts class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingContacts];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueAllowUsers class]])
{
TLPrivacyRule$privacyValueAllowUsers *allowUsers = (TLPrivacyRule$privacyValueAllowUsers *)rule;
privacySettings = [privacySettings modifyAlwaysShareWithUserIds:allowUsers.users];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueDisallowAll class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingNobody];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueDisallowContacts class]])
{
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueDisallowUsers class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingNobody];
TLPrivacyRule$privacyValueDisallowUsers *disallowUsers = (TLPrivacyRule$privacyValueDisallowUsers *)rule;
privacySettings = [privacySettings modifyNeverShareWithUserIds:disallowUsers.users];
}
}
_accountSettings = [[TGAccountSettings alloc] initWithNotificationSettings:[privacySettings normalize] groupsAndChannelsSettings:_accountSettings.groupsAndChannelsSettings accountTTLSetting:_accountSettings.accountTTLSetting];
_privacySettingsReceived = true;
[self _maybeComplete];
}
- (void)groupsAndChannelsSettingsRequestSuccess:(TLaccount_PrivacyRules *)privacyRules
{
[TGUserDataRequestBuilder executeUserDataUpdate:privacyRules.users];
TGNotificationPrivacyAccountSetting *privacySettings = [[TGNotificationPrivacyAccountSetting alloc] initWithDefaultValues];
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingNobody];
for (TLPrivacyRule *rule in privacyRules.rules)
{
if ([rule isKindOfClass:[TLPrivacyRule$privacyValueAllowAll class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingEverybody];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueAllowContacts class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingContacts];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueAllowUsers class]])
{
TLPrivacyRule$privacyValueAllowUsers *allowUsers = (TLPrivacyRule$privacyValueAllowUsers *)rule;
privacySettings = [privacySettings modifyAlwaysShareWithUserIds:allowUsers.users];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueDisallowAll class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingNobody];
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueDisallowContacts class]])
{
}
else if ([rule isKindOfClass:[TLPrivacyRule$privacyValueDisallowUsers class]])
{
privacySettings = [privacySettings modifyLastSeenPrimarySetting:TGPrivacySettingsLastSeenPrimarySettingNobody];
TLPrivacyRule$privacyValueDisallowUsers *disallowUsers = (TLPrivacyRule$privacyValueDisallowUsers *)rule;
privacySettings = [privacySettings modifyNeverShareWithUserIds:disallowUsers.users];
}
}
_accountSettings = [[TGAccountSettings alloc] initWithNotificationSettings:_accountSettings.notificationSettings groupsAndChannelsSettings:[privacySettings normalize] accountTTLSetting:_accountSettings.accountTTLSetting];
_groupsAndChannelsSettingsReceived = true;
[self _maybeComplete];
}
- (void)privacySettingsRequestFailed
{
_privacySettingsReceived = true;
[self _maybeComplete];
}
- (void)groupsAndChannelsSettingsRequestFailed {
_groupsAndChannelsSettingsReceived = true;
[self _maybeComplete];
}
@end