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

90 lines
2.5 KiB
Objective-C

#import "TGRecentContextBotsSignal.h"
@implementation TGRecentContextBotsSignal
+ (SQueue *)queue {
static SQueue *queue = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
queue = [[SQueue alloc] init];
});
return queue;
}
+ (SVariable *)_recentBots {
static SVariable *variable = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
variable = [[SVariable alloc] init];
[variable set:[self _loadRecentBots]];
});
return variable;
}
+ (SSignal *)_loadRecentBots {
return [[[SSignal alloc] initWithGenerator:^id<SDisposable>(SSubscriber *subscriber) {
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"recentBots_v0"];
if (data == nil) {
[subscriber putNext:@[]];
[subscriber putCompletion];
} else {
NSArray *array = nil;
@try {
array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
} @catch (NSException *e) {
}
if (array == nil) {
[subscriber putNext:@[]];
[subscriber putCompletion];
} else {
[subscriber putNext:array];
[subscriber putCompletion];
}
}
return nil;
}] startOn:[self queue]];
}
+ (void)_storeRecentBots:(NSArray *)array {
[[self queue] dispatch:^{
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:array] forKey:@"recentBots_v0"];
}];
}
+ (void)clearRecentBots {
[[self queue] dispatch:^{
[self _storeRecentBots:@[]];
[[self _recentBots] set:[SSignal single:@[]]];
}];
}
+ (void)addRecentBot:(int32_t)userId {
if (userId == 0) {
return;
}
SSignal *signal = [[[[self _recentBots] signal] take:1] map:^id(NSArray *userIds) {
NSMutableArray *updatedUserIds = [[NSMutableArray alloc] initWithArray:userIds];
[updatedUserIds removeObject:@(userId)];
[updatedUserIds insertObject:@(userId) atIndex:0];
if (updatedUserIds.count > 128) {
[updatedUserIds removeObjectsInRange:NSMakeRange(128, updatedUserIds.count - 128)];
}
[self _storeRecentBots:updatedUserIds];
return updatedUserIds;
}];
[signal startWithNext:^(id next) {
[[self _recentBots] set:[SSignal single:next]];
}];
}
+ (SSignal *)recentBots {
return [[self _recentBots] signal];
}
@end