Ejemplo n.º 1
0
 public async Task HandleMessage(ForwardMailMessage forwardMail, Func <MailboxMessage, Task> replyMailAction)
 {
     if (_Handles != null)
     {
         await _Handles.Invoke(forwardMail, replyMailAction);
     }
 }
Ejemplo n.º 2
0
        private async Task OnEnterRole(ForwardMailMessage forwardMail, Func <MailboxMessage, Task> replyMailAction)
        {
            if (forwardMail.Id == (int)GameDBProto.MessageId.EnterRoleRequestId)
            {
                var request = GameDBProto.EnterRoleRequest.Parser.ParseFrom(forwardMail.Content);
                var role    = await _context.GameRole.AsNoTracking().FirstOrDefaultAsync(r => r.UserId == request.UserId);

                if (role == null)
                {
                    var r = _context.GameRole.Add(new GameRole {
                        UserId = request.UserId, NickName = request.NickName
                    });
                    await _context.SaveChangesAsync();

                    role = r.Entity;
                }

                var reply = new GameDBProto.EnterRoleReply {
                    Result = new GameDBProto.ReplayResult {
                        ErrorCode = 1
                    }, RoleId = role.RoleId, NickName = role.NickName
                };
                await replyMailAction(new MailboxMessage { Id      = (int)GameDBProto.MessageId.EnterRoleReplyId, Content = reply.ToByteString(),
                                                           Reserve = forwardMail.Reserve, UserId = forwardMail.UserId, ClientId = forwardMail.ClientId });
            }
        }
Ejemplo n.º 3
0
        private async Task OnGetRankRequest(ForwardMailMessage forwardMail, Func <MailboxMessage, Task> replyMailAction)
        {
            if (forwardMail.Id == (int)GameDBProto.MessageId.GetRankRequestId)
            {
                var roleScoresQuery = _context.GameScore.AsNoTracking().OrderBy(gameScore => gameScore.Score).Take(10)
                                      .Join(_context.GameRole.AsNoTracking(), gameScore => gameScore.RoleId, gameRole => gameRole.RoleId,
                                            (gameScore, gameRole) => new GameDBProto.RoleScore {
                    RoleId = gameRole.RoleId, NickName = gameRole.NickName, Score = gameScore.Score
                })
                                      .AsAsyncEnumerable();

                var reply = new GameDBProto.GetRankReply();
                await foreach (var item in roleScoresQuery)
                {
                    reply.RoleScores.Add(item);
                }
                await replyMailAction(new MailboxMessage
                {
                    Id       = (int)GameDBProto.MessageId.GetRankReplyId,
                    Content  = reply.ToByteString(),
                    Reserve  = forwardMail.Reserve,
                    UserId   = forwardMail.UserId,
                    ClientId = forwardMail.ClientId
                });
            }
        }
Ejemplo n.º 4
0
        private async Task OnSaveRoleScoreRequest(ForwardMailMessage forwardMail, Func <MailboxMessage, Task> replyMailAction)
        {
            if (forwardMail.Id == (int)GameDBProto.MessageId.SaveRoleScoreRequestId)
            {
                var request   = GameDBProto.SaveRoleScoreRequest.Parser.ParseFrom(forwardMail.Content);
                var roleScore = await _context.GameScore.AsNoTracking().FirstOrDefaultAsync(s => s.RoleId == request.RoleId);

                if (roleScore != null)
                {
                    if (roleScore.Score < request.Score)
                    {
                        roleScore.Score     = request.Score;
                        roleScore.UpateTime = DateTime.Now;
                        await _context.SaveChangesAsync();
                    }
                }
                else
                {
                    roleScore = new GameScore {
                        RoleId = request.RoleId, Score = request.Score, CreateTime = DateTime.Now, UpateTime = DateTime.Now
                    };
                    _context.Add(roleScore);
                    await _context.SaveChangesAsync();
                }
            }
        }
Ejemplo n.º 5
0
 private async Task OnSaveDropBoxRequest(ForwardMailMessage forwardMail, Func <MailboxMessage, Task> replyMailAction)
 {
     if (forwardMail.Id == (int)GameDBProto.MessageId.SaveDropBoxRequestId)
     {
         var request = GameDBProto.SaveDropBoxRequest.Parser.ParseFrom(forwardMail.Content);
         var roleBox = new GameBox {
             Id = request.BoxId, RoleId = request.RoleId, Amount = request.Amount, CouponsId = request.CouponsId, CreateTime = DateTime.Now, UpateTime = DateTime.Now
         };
         _context.Add(roleBox);
         await _context.SaveChangesAsync();
     }
 }
Ejemplo n.º 6
0
        public async Task CtoSMessage(NetPacket packet)
        {
            var _call   = Context.Items["_call"] as AsyncDuplexStreamingCall <ForwardMailMessage, MailboxMessage>;
            var forward = new ForwardMailMessage
            {
                Id      = packet.Id,
                Content = ByteString.FromBase64(packet.Content),
                Reserve = packet.Reserve
            };

            try
            {
                await _call.RequestStream.WriteAsync(forward);
            }
            catch (Exception e)
            {
                _logger.LogWarning(e.Message);
            }
        }
Ejemplo n.º 7
0
        private async Task OnLoadConfigRequest(ForwardMailMessage forwardMail, Func <MailboxMessage, Task> replyMailAction)
        {
            if (forwardMail.Id == (int)GameDBProto.MessageId.LoadConfigRequestId)
            {
                var fruitConfigProto = new WatermelonConfigProto.FruitConfig();
                var fruitConfigQuery = _context.FruitConfig.AsNoTracking().OrderBy(s => s.FruitId).AsAsyncEnumerable();;
                await foreach (var item in fruitConfigQuery)
                {
                    fruitConfigProto.Items.Add(item.FruitId, new WatermelonConfigProto.Fruit {
                        Id    = item.FruitId, Rate = item.Rate, Image = item.Image, Name = item.Name,
                        Score = item.Score, CombineFruitId = item.CombineFruitId
                    });
                }

                var truntableConfigProto = new WatermelonConfigProto.TruntableConfig();
                var truntableConfigQuery = _context.TruntableConfig.AsNoTracking().AsAsyncEnumerable();;
                await foreach (var item in truntableConfigQuery)
                {
                    truntableConfigProto.Items.Add(item.Id, new WatermelonConfigProto.TruntableItem {
                        Id = item.Id, AwardDesc = item.AwardDesc, ImagePath = item.ImagePath, Price = item.Price
                    });
                }


                var reply = new GameDBProto.LoadConfigReply {
                    FruitConfig     = Google.Protobuf.WellKnownTypes.Any.Pack(fruitConfigProto),
                    TruntableConfig = Google.Protobuf.WellKnownTypes.Any.Pack(truntableConfigProto),
                };

                await replyMailAction(new MailboxMessage
                {
                    Id       = (int)GameDBProto.MessageId.LoadConfigReplyId,
                    Content  = reply.ToByteString(),
                    Reserve  = forwardMail.Reserve,
                    UserId   = forwardMail.UserId,
                    ClientId = forwardMail.ClientId
                });
            }
        }
Ejemplo n.º 8
0
        public void Start()
        {
            if (Sourse != null && !Sourse.IsCancellationRequested)
            {
                return;
            }

            Sourse = new CancellationTokenSource();

            var callOptions = new CallOptions(new Metadata {
                new Metadata.Entry("mailbox-name", "game")
            }, cancellationToken: Sourse.Token);
            var _call = _client.Mailbox(callOptions.WithWaitForReady());

            _ = Task.Run(async() =>
            {
                var incomeMailQueue = _dbMailQueueRepository.GetIncomeMailQueue();
                await foreach (var message in _call.ResponseStream.ReadAllAsync(Sourse.Token))
                {
                    await incomeMailQueue.WriteAsync(new MailPacket {
                        Id      = message.Id, Content = message.Content.ToByteArray(),
                        Reserve = message.Reserve, UserId = message.UserId, ClientId = message.ClientId
                    });
                }
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("!!!end");
                Console.ResetColor();
            }, Sourse.Token);


            _ = Task.Run(async() =>
            {
                while (!Sourse.Token.IsCancellationRequested)
                {
                    try
                    {
                        if (CurrentMail == null)
                        {
                            if (await _mailChannel.Reader.WaitToReadAsync(Sourse.Token))
                            {
                                if (_mailChannel.Reader.TryRead(out var mail))
                                {
                                    CurrentMail = mail;
                                    await WriteDBMail(CurrentMail);
                                    CurrentMail = null;
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        else
                        {
                            await WriteDBMail(CurrentMail);
                            CurrentMail = null;
                        }
                    }
                    catch (Exception e)
                    {
                        _logger.LogWarning(e.Message);
                        Sourse.Cancel();
                    }
                }
            }, Sourse.Token);

            async Task WriteDBMail(MailPacket mail)
            {
                var forward = new ForwardMailMessage
                {
                    Id      = mail.Id,
                    Content = mail.Content != null?Google.Protobuf.ByteString.CopyFrom(mail.Content) : Google.Protobuf.ByteString.Empty,
                                  Reserve = mail.ClientId, UserId = mail.UserId, ClientId = mail.ClientId
                };

                try
                {
                    await _call.RequestStream.WriteAsync(forward);
                }
                catch (Exception e)
                {
                    _logger.LogWarning(e.Message);
                    Sourse.Cancel();
                    EventCancelled?.Invoke(_type);
                }
            }
        }