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

100 lines
2.8 KiB
Objective-C

#import "TGChannelList.h"
#import "TGConversation.h"
#import "TGChannelStateSignals.h"
#import "TGUpdateStateRequestBuilder.h"
#import "ActionStage.h"
@interface TGChannelList () {
NSMutableArray *_channels;
NSMutableDictionary *_channelStateDisposables;
NSMutableArray *_uncommitedPeerIds;
}
@end
@implementation TGChannelList
- (instancetype)initWithChannels:(NSArray *)channels {
self = [super init];
if (self != nil) {
_channelStateDisposables = [[NSMutableDictionary alloc] init];
_uncommitedPeerIds = [[NSMutableArray alloc] init];
_channels = [[NSMutableArray alloc] initWithArray:channels];
[_channels sortUsingComparator:^NSComparisonResult(TGConversation *lhs, TGConversation *rhs) {
int result = TGConversationSortKeyCompare(lhs.variantSortKey, rhs.variantSortKey);
if (result > 0) {
return NSOrderedAscending;
} else if (result < 0) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}];
}
return self;
}
- (void)dealloc {
for (id<SDisposable> disposable in _channelStateDisposables.allValues) {
[disposable dispose];
}
}
- (NSArray *)channels {
return [[NSArray alloc] initWithArray:_channels];
}
- (bool)updateChannel:(TGConversation *)conversation {
for (NSUInteger i = 0; i < _channels.count; i++) {
TGConversation *currentChannel = _channels[i];
if (currentChannel.conversationId == conversation.conversationId) {
[_channels removeObjectAtIndex:i];
break;
}
}
bool inserted = false;
for (NSUInteger i = 0; i < _channels.count; i++) {
TGConversation *currentChannel = _channels[i];
if (TGConversationSortKeyCompare(conversation.variantSortKey, currentChannel.variantSortKey) > 0) {
[_channels insertObject:conversation atIndex:i];
inserted = true;
break;
}
}
if (!inserted) {
[_channels addObject:conversation];
}
if (![_uncommitedPeerIds containsObject:@(conversation.conversationId)]) {
[_uncommitedPeerIds addObject:@(conversation.conversationId)];
}
return true;
}
- (void)commitUpdatedChannels {
NSMutableArray *channels = [[NSMutableArray alloc] init];
for (NSNumber *nPeerId in _uncommitedPeerIds) {
for (TGConversation *conversation in _channels) {
if (conversation.conversationId == [nPeerId longLongValue]) {
[channels addObject:conversation];
break;
}
}
}
[_uncommitedPeerIds removeAllObjects];
[ActionStageInstance() dispatchResource:@"/tg/conversations" resource:[[SGraphObjectNode alloc] initWithObject:channels]];
}
@end