mirror of
https://github.com/danog/Telegram.git
synced 2024-12-02 09:27:55 +01:00
155 lines
5.7 KiB
Objective-C
155 lines
5.7 KiB
Objective-C
#import "TGPeerSettingsActor.h"
|
|
|
|
#import "ActionStage.h"
|
|
#import "SGraphObjectNode.h"
|
|
|
|
#import "TGDatabase.h"
|
|
|
|
#import "TGTelegraph.h"
|
|
|
|
#import "TGUpdateStateRequestBuilder.h"
|
|
|
|
#import "TGTelegramNetworking.h"
|
|
|
|
int cachedMessageSettingsVersion = -1;
|
|
int cachedGroupSettingsVersion = -1;
|
|
|
|
@interface TGPeerSettingsActor ()
|
|
|
|
@property (nonatomic) int64_t peerId;
|
|
|
|
@property (nonatomic) bool force;
|
|
|
|
@end
|
|
|
|
@implementation TGPeerSettingsActor
|
|
|
|
@synthesize peerId = _peerId;
|
|
|
|
@synthesize force = _force;
|
|
|
|
+ (NSString *)genericPath
|
|
{
|
|
return @"/tg/peerSettings/@";
|
|
}
|
|
|
|
- (void)prepare:(NSDictionary *)options
|
|
{
|
|
if ([[options objectForKey:@"force"] boolValue])
|
|
self.requestQueueName = @"settings";
|
|
}
|
|
|
|
- (void)execute:(NSDictionary *)options
|
|
{
|
|
_peerId = [[options objectForKey:@"peerId"] longLongValue];
|
|
if (_peerId == 0)
|
|
{
|
|
[ActionStageInstance() nodeRetrieveFailed:self.path];
|
|
return;
|
|
}
|
|
|
|
bool cachedOnly = [self.path hasSuffix:@"cachedOnly)"];
|
|
|
|
_force = [[options objectForKey:@"force"] boolValue];
|
|
|
|
bool notFound = false;
|
|
|
|
int soundId = 0;
|
|
int muteUntil = 0;
|
|
bool previewText = true;
|
|
bool messagesMuted = false;
|
|
|
|
[TGDatabaseInstance() loadPeerNotificationSettings:_peerId soundId:&soundId muteUntil:&muteUntil previewText:&previewText messagesMuted:&messagesMuted notFound:¬Found];
|
|
|
|
if ((notFound || _force) && !cachedOnly)
|
|
{
|
|
self.cancelToken = [TGTelegraphInstance doRequestPeerNotificationSettings:_peerId accessHash:[options[@"accessHash"] longLongValue] actor:self];
|
|
}
|
|
else
|
|
{
|
|
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:muteUntil], @"muteUntil", [NSNumber numberWithInt:soundId], @"soundId", [NSNumber numberWithBool:previewText], @"previewText", [[NSNumber alloc] initWithBool:messagesMuted], @"messagesMuted", nil];
|
|
|
|
[ActionStageInstance() nodeRetrieved:self.path node:[[SGraphObjectNode alloc] initWithObject:dict]];
|
|
|
|
if ((_peerId == INT_MAX - 1 && cachedMessageSettingsVersion < [TGUpdateStateRequestBuilder stateVersion]) || (_peerId == INT_MAX - 2 && cachedGroupSettingsVersion < [TGUpdateStateRequestBuilder stateVersion]))
|
|
{
|
|
[ActionStageInstance() requestActor:[[NSString alloc] initWithFormat:@"/tg/peerSettings/(%lld,force)", _peerId] options:[[NSDictionary alloc] initWithObjectsAndKeys:[[NSNumber alloc] initWithLongLong:_peerId], @"peerId", [[NSNumber alloc] initWithBool:true], @"force", nil] watcher:TGTelegraphInstance];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)peerNotifySettingsRequestSuccess:(TLPeerNotifySettings *)settings
|
|
{
|
|
int peerSoundId = 0;
|
|
int muteUntil = 0;
|
|
bool previewText = true;
|
|
bool messagesMuted = true;
|
|
|
|
if ([settings isKindOfClass:[TLPeerNotifySettings$peerNotifySettings class]])
|
|
{
|
|
TLPeerNotifySettings$peerNotifySettings *concreteSettings = (TLPeerNotifySettings$peerNotifySettings *)settings;
|
|
muteUntil = concreteSettings.mute_until;
|
|
if (muteUntil <= [[TGTelegramNetworking instance] approximateRemoteTime])
|
|
muteUntil = 0;
|
|
|
|
if (concreteSettings.sound.length == 0)
|
|
peerSoundId = 0;
|
|
else if ([concreteSettings.sound isEqualToString:@"default"])
|
|
peerSoundId = 1;
|
|
else
|
|
peerSoundId = [concreteSettings.sound intValue];
|
|
|
|
previewText = concreteSettings.flags & (1 << 0);
|
|
messagesMuted = concreteSettings.flags & (1 << 1);
|
|
}
|
|
|
|
TGChangeNotificationSettingsFutureAction *action = (TGChangeNotificationSettingsFutureAction *)[TGDatabaseInstance() loadFutureAction:_peerId type:TGChangeNotificationSettingsFutureActionType];
|
|
|
|
if (action != nil)
|
|
{
|
|
muteUntil = action.muteUntil;
|
|
peerSoundId = action.soundId;
|
|
previewText = action.previewText;
|
|
messagesMuted = action.messagesMuted;
|
|
}
|
|
else if ([TGDatabaseInstance() loadFutureAction:0 type:TGClearNotificationsFutureActionType] != nil)
|
|
{
|
|
muteUntil = 0;
|
|
peerSoundId = 1;
|
|
previewText = true;
|
|
messagesMuted = false;
|
|
}
|
|
|
|
if (_peerId == INT_MAX - 1)
|
|
cachedMessageSettingsVersion = [TGUpdateStateRequestBuilder stateVersion];
|
|
else if (_peerId == INT_MAX - 2)
|
|
cachedGroupSettingsVersion = [TGUpdateStateRequestBuilder stateVersion];
|
|
|
|
bool force = _force;
|
|
int64_t peerId = _peerId;
|
|
|
|
[TGDatabaseInstance() storePeerNotificationSettings:_peerId soundId:peerSoundId muteUntil:muteUntil previewText:previewText messagesMuted:messagesMuted writeToActionQueue:false completion:^(bool changed)
|
|
{
|
|
if (changed && force)
|
|
{
|
|
[ActionStageInstance() dispatchOnStageQueue:^
|
|
{
|
|
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:muteUntil], @"muteUntil", [NSNumber numberWithInt:peerSoundId], @"soundId", [[NSNumber alloc] initWithBool:previewText], @"previewText", [[NSNumber alloc] initWithBool:messagesMuted], @"messagesMuted", nil];
|
|
|
|
[ActionStageInstance() dispatchResource:[NSString stringWithFormat:@"/tg/peerSettings/(%lld)", peerId] resource:[[SGraphObjectNode alloc] initWithObject:dict]];
|
|
}];
|
|
}
|
|
}];
|
|
|
|
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:muteUntil], @"muteUntil", [NSNumber numberWithInt:peerSoundId], @"soundId", [NSNumber numberWithBool:previewText], @"previewText", [[NSNumber alloc] initWithBool:messagesMuted], @"messagesMuted", nil];
|
|
|
|
[ActionStageInstance() nodeRetrieved:self.path node:[[SGraphObjectNode alloc] initWithObject:dict]];
|
|
}
|
|
|
|
- (void)peerNotifySettingsRequestFailed
|
|
{
|
|
[ActionStageInstance() nodeRetrieveFailed:self.path];
|
|
}
|
|
|
|
@end
|