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

108 lines
3.0 KiB
Objective-C

#import "TGBlockedPeersSignals.h"
#import "ActionStage.h"
#import "TGUser.h"
#import "TGTelegraph.h"
@interface TGBlockedPeersHelper : NSObject <ASWatcher>
{
int64_t _peerId;
void (^_blockedUpdated)(bool);
}
@property (nonatomic, strong) ASHandle *actionHandle;
@end
@implementation TGBlockedPeersHelper
- (instancetype)initWithPeerId:(int64_t)peerId blockedUpdated:(void (^)(bool))blockedUpdated
{
self = [super init];
if (self != nil)
{
_peerId = peerId;
_blockedUpdated = [blockedUpdated copy];
_actionHandle = [[ASHandle alloc] initWithDelegate:self];
[ActionStageInstance() dispatchOnStageQueue:^
{
[ActionStageInstance() requestActor:[[NSString alloc] initWithFormat:@"/tg/blockedUsers/(%" PRId32 ",cached)", (int32_t)peerId] options:@{@"uid": @(peerId)} watcher:self];
[ActionStageInstance() watchForPath:@"/tg/blockedUsers" watcher:self];
}];
}
return self;
}
- (void)dealloc
{
[ActionStageInstance() removeWatcher:self];
}
- (void)actionStageResourceDispatched:(NSString *)path resource:(id)resource arguments:(id)__unused arguments
{
[self actorCompleted:ASStatusSuccess path:path result:resource];
}
- (void)actorCompleted:(int)__unused status path:(NSString *)path result:(id)result
{
if ([path hasPrefix:@"/tg/blockedUsers"])
{
id blockedResult = ((SGraphObjectNode *)result).object;
bool blocked = false;
if ([blockedResult respondsToSelector:@selector(boolValue)])
blocked = [blockedResult boolValue];
else if ([blockedResult isKindOfClass:[NSArray class]])
{
for (TGUser *user in blockedResult)
{
if (user.uid == _peerId)
{
blocked = true;
break;
}
}
}
if (_blockedUpdated)
_blockedUpdated(blocked);
}
}
@end
@implementation TGBlockedPeersSignals
+ (SSignal *)peerBlockedStatusWithPeerId:(int64_t)peerId
{
return [[SSignal alloc] initWithGenerator:^id<SDisposable>(SSubscriber *subscriber)
{
TGBlockedPeersHelper *helper = [[TGBlockedPeersHelper alloc] initWithPeerId:peerId blockedUpdated:^(bool blocked)
{
[subscriber putNext:@(blocked)];
}];
return [[SBlockDisposable alloc] initWithBlock:^
{
[helper description]; //keep reference
}];
}];
}
+ (SSignal *)updatePeerBlockedStatusWithPeerId:(int64_t)peerId blocked:(bool)blocked
{
return [[SSignal alloc] initWithGenerator:^id<SDisposable>(SSubscriber *subscriber)
{
static int actionId = 0;
[ActionStageInstance() requestActor:[[NSString alloc] initWithFormat:@"/tg/changePeerBlockedStatus/(cbs%d)", actionId++] options:@{@"peerId": @((int32_t)peerId), @"block": @(blocked)} watcher:TGTelegraphInstance];
[subscriber putCompletion];
return nil;
}];
}
@end