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

167 lines
6.3 KiB
Objective-C

#import "TGExtendedChatDataRequestActor.h"
#import "ActionStage.h"
#import "SGraphObjectNode.h"
#import "TGUpdateStateRequestBuilder.h"
#import "TGUserDataRequestBuilder.h"
#import "TGTelegraph.h"
#import "TGDatabase.h"
#import "TGConversation+Telegraph.h"
#import "TGConversationAddMessagesActor.h"
#import "TGTelegramNetworking.h"
#import "TGBotSignals.h"
static NSMutableDictionary *extendedChatDataDictionary()
{
static NSMutableDictionary *dict = nil;
static int updateStateVersion = 0;
if (dict == nil)
{
dict = [[NSMutableDictionary alloc] init];
updateStateVersion = [TGUpdateStateRequestBuilder stateVersion];
}
else if (updateStateVersion != [TGUpdateStateRequestBuilder stateVersion])
{
[dict removeAllObjects];
updateStateVersion = [TGUpdateStateRequestBuilder stateVersion];
}
return dict;
}
@interface TGExtendedChatDataRequestActor ()
@property (nonatomic) int64_t conversationId;
@end
@implementation TGExtendedChatDataRequestActor
@synthesize conversationId = _conversationId;
+ (NSString *)genericPath
{
return @"/tg/conversationExtended/@";
}
- (void)execute:(NSDictionary *)options
{
_conversationId = [[options objectForKey:@"conversationId"] longLongValue];
TGConversation *conversation = [TGDatabaseInstance() loadConversationWithId:_conversationId];
NSDictionary *resultDict = [extendedChatDataDictionary() objectForKey:[[NSNumber alloc] initWithLongLong:_conversationId]];
if (resultDict != nil && conversation.chatVersion == [resultDict[@"version"] intValue])
{
[ActionStageInstance() nodeRetrieved:self.path node:[[SGraphObjectNode alloc] initWithObject:resultDict]];
}
else
{
self.cancelToken = [TGTelegraphInstance doRequestConversationData:_conversationId actor:self];
}
}
- (void)chatFullRequestSuccess:(TLmessages_ChatFull *)chatFull
{
[TGUserDataRequestBuilder executeUserDataUpdate:chatFull.users];
TLPeerNotifySettings *settings = chatFull.full_chat.notify_settings;
int peerSoundId = 0;
int peerMuteUntil = 0;
bool peerPreviewText = true;
bool messagesMuted = false;
if ([settings isKindOfClass:[TLPeerNotifySettings$peerNotifySettings class]])
{
TLPeerNotifySettings$peerNotifySettings *concreteSettings = (TLPeerNotifySettings$peerNotifySettings *)settings;
peerMuteUntil = concreteSettings.mute_until;
if (peerMuteUntil <= [[TGTelegramNetworking instance] approximateRemoteTime])
peerMuteUntil = 0;
if (concreteSettings.sound.length == 0)
peerSoundId = 0;
else if ([concreteSettings.sound isEqualToString:@"default"])
peerSoundId = 1;
else
peerSoundId = [concreteSettings.sound intValue];
peerPreviewText = concreteSettings.flags & (1 << 0);
messagesMuted = concreteSettings.flags & (1 << 1);
}
int64_t conversationId = _conversationId;
[TGDatabaseInstance() storePeerNotificationSettings:_conversationId soundId:peerSoundId muteUntil:peerMuteUntil previewText:peerPreviewText messagesMuted:messagesMuted writeToActionQueue:false completion:^(bool changed)
{
if (changed)
{
[ActionStageInstance() dispatchOnStageQueue:^
{
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:peerMuteUntil], @"muteUntil", [NSNumber numberWithInt:peerSoundId], @"soundId", [[NSNumber alloc] initWithBool:peerPreviewText], @"previewText", [[NSNumber alloc] initWithBool:messagesMuted], @"messagesMuted", nil];
[extendedChatDataDictionary() setObject:dict forKey:[[NSNumber alloc] initWithLongLong:conversationId]];
[ActionStageInstance() dispatchResource:[NSString stringWithFormat:@"/tg/peerSettings/(%lld)", conversationId] resource:[[SGraphObjectNode alloc] initWithObject:dict]];
}];
}
}];
TGConversationParticipantsData *participantsData = nil;
if ([chatFull.full_chat isKindOfClass:[TLChatFull$chatFull class]])
{
TLChatFull$chatFull *concreteChatFull = (TLChatFull$chatFull *)chatFull.full_chat;
participantsData = [[TGConversationParticipantsData alloc] initWithTelegraphParticipantsDesc:concreteChatFull.participants];
}
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:peerMuteUntil], @"muteUntil", [NSNumber numberWithInt:peerSoundId], @"soundId", @(participantsData.version), @"version", nil];
[extendedChatDataDictionary() setObject:dict forKey:[[NSNumber alloc] initWithLongLong:_conversationId]];
if ([chatFull.full_chat.exported_invite isKindOfClass:[TLExportedChatInvite$chatInviteExported class]])
{
participantsData.exportedChatInviteString = ((TLExportedChatInvite$chatInviteExported *)chatFull.full_chat.exported_invite).link;
}
[TGDatabaseInstance() storeConversationParticipantData:-chatFull.full_chat.n_id participantData:participantsData];
if (chatFull.chats.count != 0)
{
TGConversation *conversation = [[TGConversation alloc] initWithTelegraphChatDesc:[chatFull.chats lastObject]];
static int actionId = 0;
[[[TGConversationAddMessagesActor alloc] initWithPath:[[NSString alloc] initWithFormat:@"/tg/addmessage/(chatData%d)", actionId++]] execute:[[NSDictionary alloc] initWithObjectsAndKeys:[[NSArray alloc] initWithObjects:conversation, nil], @"chats", nil]];
}
if ([chatFull.full_chat isKindOfClass:[TLChatFull$chatFull class]])
{
TLChatFull$chatFull *concreteChatFull = (TLChatFull$chatFull *)chatFull.full_chat;
if (concreteChatFull.bot_info.count != 0)
{
for (TLBotInfo *info in concreteChatFull.bot_info)
{
if ([info isKindOfClass:[TLBotInfo$botInfo class]])
{
TGBotInfo *botInfo = [TGBotSignals botInfoForInfo:info];
if (botInfo != nil)
[TGDatabaseInstance() storeBotInfo:botInfo forUserId:((TLBotInfo$botInfo *)info).user_id];
}
}
}
}
[ActionStageInstance() nodeRetrieved:self.path node:[[SGraphObjectNode alloc] initWithObject:dict]];
}
- (void)chatFullRequestFailed
{
[ActionStageInstance() nodeRetrieveFailed:self.path];
}
@end