예제 #1
0
        async public Task <APIReturn> Sitdown([FromForm] int deskId, [FromForm] int pos)
        {
            await CheckPlayer();

            var desk = await Desk.FindAsync(deskId);

            if (desk == null || pos < 1 || pos > 3)
            {
                throw new Exception("桌位或座位不存在");
            }
            await Standup();

            var sitdowned = redis.HGet <Player>("sitdown_ht", $"{desk.Id}_{pos}");

            if (sitdowned != null && sitdowned.Id != CurrentPlayer.Id)
            {
                throw new Exception("该桌位已被其他用户坐下");
            }
            if (!redis.HSetNx("sitdown_ht", $"{desk.Id}_{pos}", CurrentPlayer))
            {
                throw new Exception("该桌位已被其他用户坐下");
            }
            redis.HSet("sitdown_player_ht", CurrentPlayer.Id.ToString(), $"{desk.Id}_{pos}");
            //通知消息,坐位有用户坐下
            ImHelper.SendChanMessage(Guid.Empty, "ddz_chan", new
            {
                type   = "Sitdown",
                deskId = desk.Id,
                pos    = pos,
                player = CurrentPlayer,
                msg    = $"{CurrentPlayer.Nick} 坐下了座位 ({desk.Title}, POS:{pos})"
            });
            //判断三人都在,游戏开始
            var players = redis.HMGet <Player>("sitdown_ht", new[] { $"{desk.Id}_1", $"{desk.Id}_2", $"{desk.Id}_3" });

            if (players.Where(a => a == null).Any() == false)
            {
                var ddz = GamePlay.Create(players.Select(a => a.Nick).ToArray(), 1, 3);
                ddz.Shuffle();
                ImHelper.JoinChan(players[0].Id, desk.Title);
                ImHelper.JoinChan(players[1].Id, desk.Title);
                ImHelper.JoinChan(players[2].Id, desk.Title);
                ImHelper.SendChanMessage(Guid.Empty, "ddz_chan", new
                {
                    type    = "GameStarted",
                    deskId  = desk.Id,
                    players = players,
                    msg     = $"{desk.Title} 三人就位,游戏开始,{players[0].Nick} VS {players[1].Nick} VS {players[2].Nick}"
                });
                using (var pipe = redis.StartPipe())
                {
                    pipe.HMSet($"ddz_gameplay_ht{ddz.Id}", "players", players, "desk", desk);
                    pipe.HMSet("ddz_gameplay_player_ht", players[0].Id.ToString(), ddz.Id, players[1].Id.ToString(), ddz.Id, players[2].Id.ToString(), ddz.Id,
                               players[0].Nick, ddz.Id, players[1].Nick, ddz.Id, players[2].Nick, ddz.Id);
                    pipe.EndPipe();
                }
                SendGameMessage(ddz, players);
            }
            return(APIReturn.成功);
        }
예제 #2
0
        async public static Task StandupStatic(Player player)
        {
            var sitdownKey = redis.HGet("sitdown_player_ht", player.Id.ToString());

            if (!string.IsNullOrEmpty(sitdownKey))
            {
                using (var pipe = redis.StartPipe())
                {
                    pipe.HDel("sitdown_player_ht", player.Id.ToString());
                    pipe.HDel("sitdown_ht", sitdownKey);
                    pipe.EndPipe();
                }
                //通知消息,坐位有用户离开
                var dp     = sitdownKey.Split('_');
                var deskId = int.Parse(dp[0]);
                var desk   = await Desk.FindAsync(deskId);

                ImHelper.SendChanMessage(Guid.Empty, "ddz_chan", new
                {
                    type   = "Standup",
                    deskId = desk.Id,
                    pos    = int.Parse(dp[1]),
                    msg    = $"{player.Nick} 离开了座位 ({desk.Title}, POS:{dp[1]})"
                });
            }
        }
예제 #3
0
        async public Task <APIReturn> SendChannelMsg([FromForm] string channel, [FromForm] string message)
        {
            await CheckPlayer();

            ImHelper.SendChanMessage(CurrentPlayer.Id, channel, message);
            return(APIReturn.成功);
        }
예제 #4
0
 public object sendChannelmsg([FromForm] string websocketId, [FromForm] string channel, [FromForm] string message)
 {
     ImHelper.SendChanMessage(websocketId, channel, message);
     return(new
     {
         code = 0
     });
 }
예제 #5
0
        public static void OnGameOver(GamePlay game)
        {
            object[] gpdb = null;
            using (var pipe = redis.StartPipe())
            {
                pipe.HGet <Player[]>($"ddz_gameplay_ht{game.Id}", "players");
                pipe.HGet <Desk>($"ddz_gameplay_ht{game.Id}", "desk");
                gpdb = pipe.EndPipe();
            }
            var players = gpdb[0] as Player[];
            var desk    = gpdb[1] as Desk;

            ImHelper.LeaveChan(players[0].Id, desk.Title);
            ImHelper.LeaveChan(players[1].Id, desk.Title);
            ImHelper.LeaveChan(players[2].Id, desk.Title);
            using (var pipe = redis.StartPipe())
            {
                pipe.HDel($"ddz_gameplay_ht{game.Id}", "players", "desk");
                pipe.HDel("ddz_gameplay_player_ht", players[0].Id.ToString(), players[1].Id.ToString(), players[2].Id.ToString(),
                          players[0].Nick, players[1].Nick, players[2].Nick);
                pipe.HDel("sitdown_ht", new[] { $"{desk.Id}_1", $"{desk.Id}_2", $"{desk.Id}_3" });
                pipe.HDel("sitdown_player_ht", players[0].Id.ToString(), players[1].Id.ToString(), players[2].Id.ToString());
                pipe.EndPipe();
            }
            Func <GamePlayer, string> getPlayerStats = pl => $"{pl.id}({pl.score})";

            var playerScoreIncr = game.Data.players.Select(a => (long)a.score).ToArray();

            lock (updateScoreLock)
            {
                BaseEntity.Orm.Update <Player>(players[0]).Set(a => a.Score + playerScoreIncr[0]).ExecuteAffrows();
                BaseEntity.Orm.Update <Player>(players[1]).Set(a => a.Score + playerScoreIncr[1]).ExecuteAffrows();
                BaseEntity.Orm.Update <Player>(players[2]).Set(a => a.Score + playerScoreIncr[2]).ExecuteAffrows();
            }
            players[0].Score += playerScoreIncr[0];
            players[1].Score += playerScoreIncr[1];
            players[2].Score += playerScoreIncr[2];

            ImHelper.SendChanMessage(Guid.Empty, "ddz_chan", new
            {
                type    = "GameOvered",
                deskId  = desk.Id,
                players = players,
                msg     = $"{desk.Title} 【游戏结束】,本局炸弹 {game.Data.bong}个,{game.Data.players[0].id}({game.Data.players[0].score}),{game.Data.players[1].id}({game.Data.players[1].score}),{game.Data.players[2].id}({game.Data.players[2].score})"
            });
            SendGameMessage(game, players);
        }
예제 #6
0
        public async Task <AjaxResult <object> > SendMsg([FromForm] Guid from, [FromForm] int ope, [FromForm] Guid to, [FromForm] int type, [FromForm] string body, [FromForm] string frominfo)
        {
            //判断是否存在
            if (!await _userManager.CheckAccid(from.ToString(), Appid))
            {
                return(new AjaxResult <object>("消息发送者 不存在"));
            }
            if (ope == 0)
            {
                if (!await _userManager.CheckAccid(to.ToString(), Appid))
                {
                    return(new AjaxResult <object>("用户id 不存在"));
                }
            }
            else if (ope == 1)
            {
                if (!await _channelManager.CheckChannel(to.ToString(), Appid))
                {
                    return(new AjaxResult <object>("群id 不存在"));
                }
            }
            else
            {
                return(new AjaxResult <object>("ope不存在"));
            }

            int id = await _msgManager.Add(Appid, from.ToString(), ope, to.ToString(), type, body);

            //判断自己是否在线
            if (!ImHelper.HasOnline(from))
            {
                return(new AjaxResult <object>("你不在线"));
            }
            //发送消息
            if (ope == 0)//单聊
            {
                ImHelper.SendMessage(from, new[] { to }, new { id, ope, type, to, body, frominfo, from }, true);
            }
            else if (ope == 1)//群聊
            {
                ImHelper.SendChanMessage(from, to.ToString(), new { id, ope, type, to, body, frominfo, from });
            }

            return(new AjaxResult <object>((object)(from + ":" + to)));
        }
예제 #7
0
        public IEnumerable <WeatherForecast> Get()
        {
            Commont.LogCommont.SerilogActionExtention.CreateInstance().Info($"时间:{DateTime.Now.ToString()}");
            Commont.LogCommont.SerilogActionExtention.CreateInstance().Debug($"时间:{DateTime.Now.ToString()}");
            Commont.LogCommont.SerilogActionExtention.CreateInstance().Error($"时间:{DateTime.Now.ToString()}");
            Commont.LogCommont.SerilogActionExtention.CreateInstance().Warning($"时间:{DateTime.Now.ToString()}");

            string Ip      = this.Request.Headers["X-Real-IP"].FirstOrDefault() ?? this.Request.HttpContext.Connection.RemoteIpAddress.ToString();
            var    newGuid = Guid.NewGuid();

            ImHelper.JoinChan(Guid.NewGuid(), "demoChan");//群聊,绑定消息频道
            ImHelper.PrevConnectServer(newGuid, Ip);

            ImHelper.GetChanList().Select(a => new { a.chan, a.online });
            var temp2 = Guid.NewGuid();

            for (int i = 0; i < 10; i++)
            {
                var temp = Guid.NewGuid();
                temp2 = temp;
                ImHelper.PrevConnectServer(temp, Ip);
                ImHelper.JoinChan(temp, "demoChan");//群聊,绑定消息频道
            }
            ImHelper.SendChanMessage(newGuid, "demoChan", "hello word");
            ImHelper.SendMessage(newGuid, new[] { temp2 }, " SendMessage hello word ", false);

            var rng = new Random();

            return(Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
                   .ToArray());
        }