public TransactionTargetInfo(long targetedTransactionId, Transaction chainTransaction, long count) { TargetedTransactionId = targetedTransactionId; FirstTransactionId = chainTransaction.TransactionId; LastTransactionInfo = new LastTransactionCountInfo(chainTransaction.TransactionId, chainTransaction.Timestamp, count); }
public bool UpdateLastViewedTransactinInfo(long accountId, LastTransactionCountInfo info) { if (info == null) { return(false); } if (_subscriptions.TryGetValue(accountId, out var sub)) { if (sub.LastViewedTransactionInfo != null && info.TransactionId <= sub.LastViewedTransactionInfo.TransactionId) { return(false); } if (sub.LastViewedTransactionInfo == null || info.TransactionId > sub.LastViewedTransactionInfo.TransactionId) { sub.LastViewedTransactionInfo = info; if (sub.CurrentTransactionInfo.TransactionId <= info.TransactionId) { sub.CurrentTransactionInfo = info; } SortSubscriptions(new List <SubscriptionInfo> { sub }); return(true); } } return(false); }
protected void UpdateLastTransactionInfo(Index index, LastTransactionCountInfo info) { lock (FeatureAccount) { _indices[index] = info; } }
bool UpdateCurrentTransactionInfo(long accountId, LastTransactionCountInfo info, List <SubscriptionInfo> subs) { if (info == null) { return(false); } if (_subscriptions.TryGetValue(accountId, out var sub)) { if (sub.Profile == null) { } if (sub.CurrentTransactionInfo != null && info.TransactionId <= sub.CurrentTransactionInfo.TransactionId) { return(false); } if (sub.CurrentTransactionInfo == null || info.TransactionId > sub.CurrentTransactionInfo.TransactionId) { sub.CurrentTransactionInfo = info; if (sub.LastViewedTransactionInfo == null) { sub.LastViewedTransactionInfo = info; } subs.Add(sub); return(true); } } return(false); }
public override void Update(CommitItems commitItems, IFeatureChain featureChain, Transaction transaction, FeatureData transactionFeature) { var feature = transactionFeature as AccountIndex; var info = new LastTransactionCountInfo(transaction.TransactionId, transaction.Timestamp, feature.TransactionCount); UpdateLastTransactionInfo(feature.Index, info); commitItems.DirtyAccounts.Add(transaction.AccountId); }
public void UpdateLastTransaction(Transaction chainTransaction, long count) { lock (this) { if (chainTransaction.TransactionId > LastTransactionInfo.TransactionId) { LastTransactionInfo = new LastTransactionCountInfo(chainTransaction.TransactionId, chainTransaction.Timestamp, count); } } }
public override void Update(CommitItems commitItems, IFeatureChain featureChain, Transaction transaction, FeatureData featureData) { var feature = featureData as PreviousAccountTransaction; if (transaction.MetaData.TransactionId > LastTransactionInfo.TransactionId) { LastTransactionInfo = new LastTransactionCountInfo(transaction.TransactionId, transaction.Timestamp, feature.TransactionCount); commitItems.DirtyAccounts.Add(transaction.AccountId); } }
public AccountIndexContainerBase(Unpacker unpacker, ushort size, Feature feature, FeatureAccount featureAccount) : base(unpacker, size, feature, featureAccount) { var count = unpacker.UnpackInt(); for (var i = 0; i < count; i++) { var key = new Index(unpacker); var value = new LastTransactionCountInfo(unpacker); _indices[key] = value; } }
bool SetLastReceiverInfo(Transaction chainTransaction, long count) { lock (FeatureAccount) { if (chainTransaction.TransactionId > LastReceiverTransactionInfo.TransactionId) { LastReceiverTransactionInfo = new LastTransactionCountInfo(chainTransaction.TransactionId, chainTransaction.Timestamp, count); return(true); } } return(false); }
public MessageNode(ServiceNode serviceNode) : base(serviceNode) { try { var data = serviceNode.CacheStorage.ReadFileBytes(GetType().Name); if (data != null) { using (var unpacker = new Unpacker(data)) { if (unpacker.UnpackBool()) { ProfileInfo = new ProfileInfo(unpacker); } unpacker.Unpack(_friends, (u) => new Friend(u, this)); unpacker.Unpack(_chats, (u) => new Chat(u, this)); if (unpacker.UnpackBool()) { _friendInfo = new FriendInfo(unpacker); } if (unpacker.UnpackBool()) { _lastAccountTransaction = new LastTransactionCountInfo(unpacker); } if (unpacker.UnpackBool()) { _lastReceivedTransaction = new LastTransactionCountInfo(unpacker); } InboxNameRecords = unpacker.UnpackList((u) => new InboxNameRecordInfo(u)); } } } catch (Exception ex) { Log.IgnoreException(ex); } if (InboxNameRecords == null) { InboxNameRecords = new List <InboxNameRecordInfo>(); } foreach (var inbox in _chats.Values) { GenerateSubmitAccount(inbox.Index); } UIApp.Run(GenerateDefaultExchangeKeys); }
public GroupInfo(long groupId, Unpacker unpacker) { GroupId = groupId; LastTransactionInfo = new LastTransactionCountInfo(unpacker); var count = unpacker.UnpackInt(); for (var i = 0; i < count; i++) { var key = new Index(unpacker); var value = new LastTransactionCountInfo(unpacker); _lastIndexTransactions[key] = value; } }
public void ConsumeGroup(Transaction transaction, Group group) { lock (this) { var transactionId = transaction.TransactionId; var timestamp = transaction.Timestamp; LastTransactionInfo = new LastTransactionCountInfo(transactionId, timestamp, group.PreviousGroupTransactionId); var index = group.GroupIndex; if (index != null) { _lastIndexTransactions[index] = new LastTransactionCountInfo(transactionId, timestamp, group.PreviousGroupIndexTransactionId); } } }
public SubscriptionInfo(Unpacker unpacker, Subscriptions subscriptions) { Subscriptions = subscriptions; unpacker.Unpack(out AccountId); if (unpacker.UnpackBool()) { Profile = new ProfileInfo(unpacker); } if (unpacker.UnpackBool()) { LastViewedTransactionInfo = new LastTransactionCountInfo(unpacker); } if (unpacker.UnpackBool()) { CurrentTransactionInfo = new LastTransactionCountInfo(unpacker); } }
public override void Update(CommitItems commitItems, IFeatureChain chain, Transaction transaction, FeatureData featureData) { var receivers = transaction.GetFeature <Receiver>(Receiver.FeatureId).Receivers; var sharedIndex = featureData as SharedAccountIndex; var index = sharedIndex.Index; var info = new LastTransactionCountInfo(transaction.TransactionId, transaction.Timestamp, sharedIndex.TransactionCount); UpdateLastTransactionInfo(index, info); commitItems.DirtyAccounts.Add(AccountId); foreach (var receiverId in receivers) { var account = chain.GetFeatureAccount(receiverId).GetOrAddFeatureContainer <SharedAccountIndexContainer>(SharedAccountIndex.FeatureId); account.UpdateLastTransactionInfo(index, info); commitItems.DirtyAccounts.Add(receiverId); } }
internal void UpdateLastTransactionInfo(LastTransactionCountInfo info) { LastTransactionInfo = info; }
public PreviousAccountTransactionContainer(Unpacker unpacker, ushort size, Feature feature, FeatureAccount featureAccount) : base(unpacker, size, feature, featureAccount) { LastTransactionInfo = new LastTransactionCountInfo(unpacker); }
public PreviousAccountTransactionContainer(Feature feature, FeatureAccount featureAccount) : base(feature, featureAccount) { LastTransactionInfo = LastTransactionCountInfo.Empty; }
public ReceiverContainer(Feature feature, FeatureAccount featureAccount) : base(feature, featureAccount) { LastReceiverTransactionInfo = LastTransactionCountInfo.Empty; }
// active polling is meh, should be replace by a simple notification server, but it's ok for now async Task PollLoop() { var profileInfo = (await ProfileManager.Current.GetProfileData(AccountId, ProfileDownloadType.ForceDownload, false)).ProfileInfo; if (profileInfo != null) { ProfileInfo = profileInfo; } await DownloadInboxRecords(AccountId); await QueryMissingProfiles(); while (true) { try { await DownloadFriends(false); var save = false; var lastAccountTransaction = (await PreviousAccountTransaction.DownloadLastTransactionInfo(_client, ChainType.Data, ChainId, MessageServiceInfo.MessageDataChainIndex, AccountId))?.Item; var lastReceiverTransaction = (await Receiver.DownloadLastTransactionInfo(_client, ChainType.Data, ChainId, MessageServiceInfo.MessageDataChainIndex, AccountId))?.Item; if (_lastAccountTransaction == null) { _lastAccountTransaction = lastAccountTransaction; save = true; } if (_lastReceivedTransaction == null) { _lastReceivedTransaction = lastReceiverTransaction; save = true; } var result = new PollResult(); if (lastAccountTransaction != null) { if (lastAccountTransaction.TransactionId > _lastAccountTransaction.TransactionId) { var download = new AccountTransactionDownload(AccountId, ServiceNode.GetTransactionDownloadManager(MessageServiceInfo.MessageDataChainIndex)) { MinimalTransactionId = Math.Max(1, _lastAccountTransaction.TransactionId) }; if (await Poll(download, result)) { _lastAccountTransaction = lastAccountTransaction; save = true; } } } if (lastReceiverTransaction != null) { if (lastReceiverTransaction.TransactionId > _lastReceivedTransaction.TransactionId) { var download = new ReceiverTransactionDownload(AccountId, ServiceNode.GetTransactionDownloadManager(MessageServiceInfo.MessageDataChainIndex)) { MinimalTransactionId = Math.Max(1, _lastReceivedTransaction.TransactionId) }; if (await Poll(download, result)) { _lastReceivedTransaction = lastReceiverTransaction; save = true; } } } if (result.UpdateFriends) { await DownloadFriends(false); } foreach (var index in result.Indices) { var chat = GetChat(index, true); if (!IsNodeChat(chat)) { _chats[chat.Index] = chat; GenerateSubmitAccount(index); await GenerateDefaultExchangeKeys(); } await chat.DownloadMessages(false); } if (result.Indices.Count > 0) { await UIApp.PubSub.PublishAsync(new MessageNodeRefreshEvent(this)); } if (save) { await SaveAsync(); } await Task.Delay(5000); } catch (Exception ex) { Log.HandleException(ex); } } }
public GroupInfo(long groupId) { GroupId = groupId; LastTransactionInfo = LastTransactionCountInfo.Empty; }
public TransactionTargetInfo(Unpacker unpacker) { unpacker.Unpack(out TargetedTransactionId); unpacker.Unpack(out FirstTransactionId); LastTransactionInfo = new LastTransactionCountInfo(unpacker); }