Exemple #1
0
        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);
        }
Exemple #6
0
 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;
            }
        }
Exemple #9
0
 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);
 }
Exemple #10
0
        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);
        }
Exemple #11
0
        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;
            }
        }
Exemple #12
0
        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;
 }
Exemple #18
0
 public ReceiverContainer(Feature feature, FeatureAccount featureAccount) : base(feature, featureAccount)
 {
     LastReceiverTransactionInfo = LastTransactionCountInfo.Empty;
 }
Exemple #19
0
        // 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);
                }
            }
        }
Exemple #20
0
        public GroupInfo(long groupId)
        {
            GroupId = groupId;

            LastTransactionInfo = LastTransactionCountInfo.Empty;
        }
Exemple #21
0
 public TransactionTargetInfo(Unpacker unpacker)
 {
     unpacker.Unpack(out TargetedTransactionId);
     unpacker.Unpack(out FirstTransactionId);
     LastTransactionInfo = new LastTransactionCountInfo(unpacker);
 }