private void OnStreamEntryAdded(StreamEntry entry)
        {
            AllianceStreamEntryMessage allianceStreamEntryMessage = new AllianceStreamEntryMessage();

            allianceStreamEntryMessage.SetStreamEntry(entry);
            this.SendPiranhaMessage(allianceStreamEntryMessage, 1);
        }
        public static void Create(LogicLong ownerId, StreamEntry entry)
        {
            StreamDocument streamDocument = new StreamDocument(StreamManager.GetNextStreamId(), ownerId, entry);

            StreamManager.m_allianceStreams.Add(streamDocument.Id, streamDocument);
            StreamManager.Save(streamDocument);
        }
Example #3
0
        internal void AddEntry(StreamEntry StreamEntry)
        {
            StreamEntry.LowId = Interlocked.Increment(ref this.Seed);

            if (this.Slots.TryAdd(StreamEntry.StreamID, StreamEntry))
            {
                if (this.Slots.Count > 50)
                {
                    if (this.Slots.TryRemove(this.Slots.Keys.First(), out StreamEntry Removed))
                    {
                        this.RemoveEntry(Removed);
                    }
                }

                foreach (Player Player in this.Alliance.Members.Connected.Values.ToArray())
                {
                    if (Player.Connected)
                    {
                        new Alliance_Stream_Entry_Message(Player.Level.GameMode.Device, StreamEntry).Send();
                    }
                    else
                    {
                        this.Alliance.Members.Connected.TryRemove(Player.PlayerID, out _);
                    }
                }
            }
        }
Example #4
0
        public byte[] GetResource(ResourceKey key)
        {
            if (this._Entries.ContainsKey(key) == false)
            {
                throw new KeyNotFoundException();
            }

            if (this._Entries[key] is StreamEntry)
            {
                StreamEntry entry = (StreamEntry)this._Entries[key];

                this.Stream.Seek(this.BaseOffset + entry.Offset, SeekOrigin.Begin);

                byte[] data;
                if (entry.Compressed == true)
                {
                    data = this.Stream.RefPackDecompress(entry.CompressedSize, entry.DecompressedSize);
                }
                else
                {
                    data = new byte[entry.DecompressedSize];
                    this.Stream.Read(data, 0, data.Length);
                }

                return(data);
            }
            else if (this._Entries[key] is MemoryEntry)
            {
                return((byte[])(((MemoryEntry)this._Entries[key]).Data.Clone()));
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
Example #5
0
        public static Event ToEvent(StreamEntry storeEvent)
        {
            var type = Type.GetType(storeEvent.Values.First(x => x.Name == "type").Value);
            var json = Encoding.UTF8.GetString((byte[])storeEvent.Values.First(x => x.Name == "msg").Value);

            return((Event)JsonConvert.DeserializeObject(json, type));
        }
        private async Task Handle(StreamEntry streamEntry, JobData jobData)
        {
            //JobData jobData = ParseJobData(streamEntry);
            if (jobData == null)
            {
                return;
            }

            if (!string.IsNullOrEmpty(jobData.ErrorGroup) && _groupName != jobData.ErrorGroup) //是出错的任务需要重试,但不是该组的不处理
            {
                return;
            }
            var isSuccess = await HandleMessage(jobData);

            if (!isSuccess && jobData.ErrorCount < _options.MaxErrorReTryCount) //需要重试
            {
                var delaySecond = GetDelaySecond(jobData.ErrorCount);
                jobData.ErrorCount++;
                jobData.ErrorGroup = _groupName;

                await _redisStorage.EnqueueDealy(jobData, TimeSpan.FromSeconds(delaySecond));

                _logger.LogInformation($"RedisMessageBus消费失败,topic:{jobData.Topic},{delaySecond}秒后将进行{jobData.ErrorCount }次重试");
            }
        }
Example #7
0
        private static void OnAllianceRequestAllianceUnitsMessageReceived(AllianceRequestAllianceUnitsMessage message)
        {
            if (AllianceManager.TryGet(message.AccountId, out Alliance alliance) && alliance.Members.TryGetValue(message.MemberId, out AllianceMemberEntry memberEntry))
            {
                for (int i = 0; i < alliance.StreamEntryList.Size(); i++)
                {
                    StreamEntry streamEntry = StreamManager.GetAllianceStream(alliance.StreamEntryList[i]);

                    if (streamEntry != null && streamEntry.GetStreamEntryType() == StreamEntryType.DONATE && streamEntry.GetSenderAvatarId().Equals(memberEntry.GetAvatarId()))
                    {
                        alliance.RemoveStreamEntry(streamEntry.GetId());
                    }
                }

                DonateStreamEntry donateStreamEntry = new DonateStreamEntry();
                AllianceStreamEntryUtil.SetSenderInfo(donateStreamEntry, memberEntry);

                string donateMessage = message.Message;

                if (donateMessage.Length > 128)
                {
                    donateMessage = donateMessage.Substring(0, 128);
                }

                donateStreamEntry.SetMessage(donateMessage);
                donateStreamEntry.SetCasteLevel(message.CastleUpgradeLevel, message.CastleUsedCapacity, message.CastleSpellUsedCapacity, message.CastleTotalCapacity, message.CastleSpellTotalCapacity);

                StreamManager.Create(alliance.Id, donateStreamEntry);

                alliance.AddStreamEntry(donateStreamEntry);

                AllianceManager.Save(alliance);
            }
        }
        private void OnStartFriendlyChallengeSpectateMessageReceived(StartFriendlyChallengeSpectateMessage message)
        {
            if (this.m_session.Alliance != null)
            {
                Alliance  alliance = this.m_session.Alliance;
                LogicLong streamId = message.GetStreamId();

                if (alliance.StreamEntryList.IndexOf(streamId) != -1)
                {
                    StreamEntry streamEntry = StreamManager.GetAllianceStream(message.GetStreamId());

                    if (streamEntry.GetStreamEntryType() == StreamEntryType.CHALLENGE)
                    {
                        ChallengeStreamEntry challengeStreamEntry = (ChallengeStreamEntry)streamEntry;

                        if (challengeStreamEntry.IsStarted() && challengeStreamEntry.GetLiveReplayId() != null)
                        {
                            this.m_session.SendMessage(new GameSpectateLiveReplayMessage
                            {
                                LiveReplayId = challengeStreamEntry.GetLiveReplayId(),
                                IsEnemy      = false
                            }, 9);
                            return;
                        }
                    }
                }
            }

            LiveReplayFailedMessage liveReplayFailedMessage = new LiveReplayFailedMessage();

            liveReplayFailedMessage.SetReason(LiveReplayFailedMessage.Reason.GENERIC);
            this.m_session.SendPiranhaMessage(liveReplayFailedMessage, 1);
        }
        private void OnCancelChallengeMessageReceived(CancelChallengeMessage message)
        {
            if (this.m_session.Alliance != null)
            {
                Alliance            alliance    = this.m_session.Alliance;
                AllianceMemberEntry memberEntry = alliance.Members[this.m_session.AccountId];

                for (int i = 0; i < alliance.StreamEntryList.Size(); i++)
                {
                    StreamEntry streamEntry = StreamManager.GetAllianceStream(alliance.StreamEntryList[i]);

                    if (streamEntry != null && streamEntry.GetStreamEntryType() == StreamEntryType.CHALLENGE && streamEntry.GetSenderAvatarId().Equals(memberEntry.GetAvatarId()))
                    {
                        ChallengeStreamEntry prevChallengeStreamEntry = (ChallengeStreamEntry)streamEntry;

                        if (prevChallengeStreamEntry.IsStarted())
                        {
                            return;
                        }

                        alliance.RemoveStreamEntry(streamEntry.GetId());
                    }
                }
            }
        }
Example #10
0
        internal async void Process()
        {
            try
            {
                Alliance    a = ObjectManager.GetAlliance(this.Device.Player.Avatar.AllianceId);
                StreamEntry s = a.m_vChatMessages.Find(c => c.SenderID == this.Device.Player.Avatar.AllianceId && c.GetStreamEntryType() == 12);

                if (s != null)
                {
                    a.m_vChatMessages.RemoveAll(t => t == s);
                    foreach (AllianceMemberEntry op in a.GetAllianceMembers())
                    {
                        Level player = await ResourcesManager.GetPlayer(op.AvatarId);

                        if (player.Client != null)
                        {
                            new AllianceStreamEntryRemovedMessage(Device, s.ID).Send();
                        }
                    }
                }
                else
                {
                    new OutOfSyncMessage(this.Device).Send();
                }
            } catch (Exception) { }
        }
        private void OnDonateAllianceUnitMessageReceived(DonateAllianceUnitMessage message)
        {
            if (this.m_session.Alliance != null)
            {
                Alliance            alliance = this.m_session.Alliance;
                LogicCombatItemData unitData = message.GetAllianceUnitData();

                if (!unitData.IsDonationDisabled())
                {
                    if (message.UseQuickDonate())
                    {
                        if (!LogicDataTables.GetGlobals().EnableQuickDonate() || this.m_session.LogicClientAvatar.GetDiamonds() < unitData.GetDonateCost())
                        {
                            return;
                        }
                    }
                    else
                    {
                        if (this.m_session.LogicClientAvatar.GetUnitCount(unitData) <= 0)
                        {
                            return;
                        }
                    }

                    if (alliance.StreamEntryList.IndexOf(message.GetStreamId()) != -1)
                    {
                        StreamEntry streamEntry = StreamManager.GetAllianceStream(message.GetStreamId());

                        if (streamEntry.GetStreamEntryType() == StreamEntryType.DONATE)
                        {
                            DonateStreamEntry donateStreamEntry = (DonateStreamEntry)streamEntry;

                            if (donateStreamEntry.CanAddDonation(this.m_session.AccountId, message.GetAllianceUnitData(), alliance.Header.GetAllianceLevel()))
                            {
                                donateStreamEntry.AddDonation(this.m_session.AccountId, unitData, this.m_session.LogicClientAvatar.GetUnitUpgradeLevel(unitData));
                                donateStreamEntry.SetDonationPendingRequestCount(donateStreamEntry.GetDonationPendingRequestCount() + 1);

                                StreamManager.Save(donateStreamEntry);

                                alliance.UpdateStreamEntry(donateStreamEntry);

                                if (message.UseQuickDonate())
                                {
                                    this.m_session.LogicClientAvatar.CommodityCountChangeHelper(0, unitData, -1);
                                }

                                LogicDonateAllianceUnitCommand logicDonateAllianceUnitCommand = new LogicDonateAllianceUnitCommand();
                                logicDonateAllianceUnitCommand.SetData(unitData, streamEntry.GetId(), message.UseQuickDonate());
                                ServerMessageManager.SendMessage(new GameAllowServerCommandMessage
                                {
                                    AccountId     = this.m_session.AccountId,
                                    ServerCommand = logicDonateAllianceUnitCommand
                                }, 9);
                            }
                        }
                    }
                }
            }
        }
Example #12
0
 public static void SetSenderInfo(StreamEntry entry, AllianceMemberEntry member)
 {
     entry.SetSenderAvatarId(member.GetAvatarId());
     entry.SetSenderHomeId(member.GetHomeId());
     entry.SetSenderName(member.GetName());
     entry.SetSenderLevel(member.GetExpLevel());
     entry.SetSenderLeagueType(member.GetLeagueType());
     entry.SetSenderRole(member.GetAllianceRole());
 }
Example #13
0
        static Event ToEvent(StreamEntry storeEvent)
        {
            var typeString = storeEvent.Values.First(x => x.Name == "type").Value;
            var type       = Type.GetType(typeString) ?? throw new InvalidCastException($"cannot convert message {typeString}");
            var json       = Encoding.UTF8.GetString(storeEvent.Values.First(x => x.Name == "msg").Value);
            var evnt       = JsonConvert.DeserializeObject(json, type) ?? throw new InvalidCastException($"cannot convert message {typeString}");

            return((Event)evnt);
        }
        public StreamDocument(LogicLong id, LogicLong ownerId, StreamEntry entry) : base(id)
        {
            this.CreateTime = DateTime.UtcNow;
            this.OwnerId    = ownerId;
            this.Type       = StreamType.ALLIANCE;
            this.Entry      = entry;

            entry.SetId(id);
        }
Example #15
0
        internal void Remove(StreamEntry StreamEntry)
        {
            StreamEntry Removed;

            if (this.Slots.TryRemove(StreamEntry.StreamId, out Removed))
            {
                this.RemoveEntry(Removed);
            }
        }
Example #16
0
 public static void SetSenderInfo(StreamEntry entry, LogicClientAvatar avatar)
 {
     entry.SetSenderAvatarId(avatar.GetId());
     entry.SetSenderHomeId(avatar.GetCurrentHomeId());
     entry.SetSenderName(avatar.GetName());
     entry.SetSenderLevel(avatar.GetExpLevel());
     entry.SetSenderLeagueType(avatar.GetLeagueType());
     entry.SetSenderRole(avatar.GetAllianceRole());
 }
Example #17
0
        internal async Task <EventData <T> > LoadAggregateEventAsync(StreamEntry entry)
        {
            var db = _connectionMultiplexer.GetDatabase();

            string stream  = entry.Values[0].Value;
            string eventId = entry.Values[1].Value;

            var events = await db.StreamRangeAsync(stream, eventId, eventId);

            return(DeserializeEvent(eventId, events[0].Values[0].Value));
        }
Example #18
0
        /// <summary>
        /// Adds a new entry in the collection.
        /// </summary>
        public void AddEntry(StreamEntry Entry)
        {
            Entry.HighId = Config.ServerId;
            Entry.LowId  = Interlocked.Increment(ref this.Seed);

            if (this.Entries.Count > Config.MaxChatEntries)
            {
                this.RemoveEntry(this.Entries.Values.First()); // TODO : Not wise, performance side
            }

            this.Entries.Add(Entry.StreamId, Entry);
        }
Example #19
0
        internal async void Process()
        {
            try
            {
                if (this.Device.PlayerState == Logic.Enums.State.IN_BATTLE)
                {
                    ResourcesManager.DisconnectClient(Device);
                }
                else
                {
                    if (ID > 0)
                    {
                        this.Device.PlayerState = Logic.Enums.State.IN_BATTLE;
                        Alliance a        = ObjectManager.GetAlliance(this.Device.Player.Avatar.AllianceId);
                        Level    defender = await ResourcesManager.GetPlayer(a.m_vChatMessages.Find(c => c.ID == ID).SenderID);

                        if (defender != null)
                        {
                            defender.Tick();
                            new ChallangeAttackDataMessage(Device, defender).Send();
                        }
                        else
                        {
                            new OwnHomeDataMessage(Device, this.Device.Player).Send();
                        }

                        Alliance    alliance = ObjectManager.GetAlliance(this.Device.Player.Avatar.AllianceId);
                        StreamEntry s        = alliance.m_vChatMessages.Find(c => c.m_vType == 12);
                        if (s != null)
                        {
                            alliance.m_vChatMessages.RemoveAll(t => t == s);

                            foreach (AllianceMemberEntry op in alliance.GetAllianceMembers())
                            {
                                Level playera = await ResourcesManager.GetPlayer(op.AvatarId);

                                if (playera.Client != null)
                                {
                                    new AllianceStreamEntryMessage(playera.Client)
                                    {
                                        StreamEntry = s
                                    }.Send();
                                }
                            }
                        }
                    }
                    else
                    {
                        new OutOfSyncMessage(this.Device).Send();
                    }
                }
            } catch (Exception) { }
        }
 /// <summary>
 /// Updates the specified entry.
 /// </summary>
 internal void UpdateEntry(StreamEntry Entry)
 {
     if (this.Slots.ContainsKey(Entry.StreamID))
     {
         foreach (Player Player in this.Alliance.Members.Connected.Values.ToArray())
         {
             if (Player.Connected)
             {
                 // TODO Implement AllianceStreamEntryMessage().
             }
         }
     }
 }
Example #21
0
        public override void WriteJson(JsonWriter Writer, object Value, JsonSerializer Serializer)
        {
            StreamEntry StreamEntry = (StreamEntry)Value;

            if (StreamEntry != null)
            {
                StreamEntry.Save().WriteTo(Writer);
            }
            else
            {
                Writer.WriteNull();
            }
        }
Example #22
0
        public override object ReadJson(JsonReader Reader, Type ObjectType, object ExistingValue, JsonSerializer Serializer)
        {
            JObject Json = JObject.Load(Reader);

            if (JsonHelper.GetJsonNumber(Json, "type", out int Type))
            {
                StreamEntry Entry = StreamEntryFactory.CreateStreamEntryByType(Type);
                Entry.Load(Json);
                return(Entry);
            }

            return(null);
        }
        /// <summary>
        /// Decodes this instance.
        /// </summary>
        public override void Decode()
        {
            this.Entries = new StreamEntry[this.Stream.ReadVInt()];

            for (int i = 0; i < this.Entries.Length; i++)
            {
                int EntryType = this.Stream.ReadVInt();

                StreamEntry Entry = new StreamEntry();
                Entry.Decode(this.Stream);
                this.Entries[i] = Entry;
            }
        }
        protected sealed override void Save(LogicJSONObject jsonObject)
        {
            LogicJSONArray ownerIdArray = new LogicJSONArray(2);

            ownerIdArray.Add(new LogicJSONNumber(this.OwnerId.GetHigherInt()));
            ownerIdArray.Add(new LogicJSONNumber(this.OwnerId.GetLowerInt()));

            jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_OWNER_ID, ownerIdArray);
            jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_CREATE_TIME, new LogicJSONString(this.CreateTime.ToString("O")));
            jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_TYPE, new LogicJSONNumber((int)this.Type));

            switch (this.Type)
            {
            case StreamType.ALLIANCE:
            {
                LogicJSONObject entryObject = new LogicJSONObject();
                StreamEntry     entry       = (StreamEntry)this.Entry;

                jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_ENTRY_TYPE, new LogicJSONNumber((int)entry.GetStreamEntryType()));
                jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_ENTRY, entryObject);

                entry.Save(entryObject);
                break;
            }

            case StreamType.AVATAR:
            {
                LogicJSONObject   entryObject = new LogicJSONObject();
                AvatarStreamEntry entry       = (AvatarStreamEntry)this.Entry;

                jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_ENTRY_TYPE, new LogicJSONNumber((int)entry.GetAvatarStreamEntryType()));
                jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_ENTRY, entryObject);

                entry.Save(entryObject);
                break;
            }

            case StreamType.REPLAY:
            {
                LogicJSONObject   entryObject = new LogicJSONObject();
                ReplayStreamEntry entry       = (ReplayStreamEntry)this.Entry;

                jsonObject.Put(StreamDocument.JSON_ATTRIBUTE_ENTRY, entryObject);

                entry.Save(entryObject);

                break;
            }
            }
        }
        private JobData ParseJobData(StreamEntry streamEntry)
        {
            JobData jobData = null;

            try
            {
                jobData = JobData.ToJobData(streamEntry.Values);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"RedisMessageBus解析任务数据报错{_topic},{_groupName}");
            }
            return(jobData);
        }
Example #26
0
 internal void RemoveEntry(StreamEntry StreamEntry)
 {
     foreach (Player Player in this.Alliance.Members.Connected.Values.ToArray())
     {
         if (Player.Connected)
         {
             new Alliance_Stream_Entry_Removed_Message(Player.Level.GameMode.Device, StreamEntry).Send();
         }
         else
         {
             this.Alliance.Members.Connected.TryRemove(Player.PlayerID, out _);
         }
     }
 }
Example #27
0
 internal StreamInfo(int length,
                     int radixTreeKeys,
                     int radixTreeNodes,
                     int groups,
                     StreamEntry firstEntry,
                     StreamEntry lastEntry)
 {
     Length             = length;
     RadixTreeKeys      = radixTreeKeys;
     RadixTreeNodes     = radixTreeNodes;
     ConsumerGroupCount = groups;
     FirstEntry         = firstEntry;
     LastEntry          = lastEntry;
 }
 private async Task HandleWrap(StreamEntry streamEntry, JobData jobData)
 {
     try
     {
         await Handle(streamEntry, jobData);
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, $"RedisMessageBus消费失败,topic:{_topic},groupName:{_groupName}");
     }
     finally
     {
         await _database.StreamAcknowledgeAsync(_topic, _groupName, streamEntry.Id);
     }
 }
        public void AddStreamEntry(StreamEntry entry)
        {
            if (entry.GetId().IsZero())
            {
                throw new Exception("Alliance.addStreamEntry: id should be set!");
            }

            while (this.StreamEntryList.Size() >= Alliance.MAX_STREAM_ENTRY_COUNT)
            {
                this.RemoveStreamEntry(this.StreamEntryList[0]);
            }

            this.StreamEntryList.Add(entry.GetId());
            this.OnStreamEntryAdded(entry);
        }
Example #30
0
        public byte[] GetRawResource(ResourceKey key)
        {
            if (this._Entries.ContainsKey(key) == false || !(this._Entries[key] is StreamEntry))
            {
                throw new KeyNotFoundException();
            }

            StreamEntry entry = (StreamEntry)this._Entries[key];

            this.Stream.Seek(this.BaseOffset + entry.Offset, SeekOrigin.Begin);

            byte[] data = new byte[entry.CompressedSize];
            this.Stream.Read(data, 0, data.Length);
            return(data);
        }