public void Configure(IApplicationBuilder app) { app.UseResponseCompression(); app.UseDeveloperExceptionPage(); app.UseImServer(new ImServerOptions { Redis = RedisHelper.Instance, Servers = new[] { Configuration["imserver"] }, //¼¯ÈºÅäÖà Server = Configuration["imserver"] }); app.UseStaticFiles(); app.UseClientSideBlazorFiles <WasmClient.Program>(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); endpoints.MapFallbackToClientSideBlazor <WasmClient.Program>("index.html"); }); //app.UseDefaultFiles(); //app.UseStaticFiles(); ImHelper.Initialization(new ImClientOptions { Redis = RedisHelper.Instance, Servers = Configuration["imserver"].Split(';') }); ImHelper.Instance.OnSend += (s, e) => Console.WriteLine($"ImClient.SendMessage(server={e.Server},data={JsonConvert.SerializeObject(e.Message)})"); }
public void Configure(IApplicationBuilder app) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.OutputEncoding = Encoding.GetEncoding("GB2312"); Console.InputEncoding = Encoding.GetEncoding("GB2312"); app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseEndpoints(config => config.MapControllers()); app.UseDefaultFiles(); app.UseStaticFiles(); ImHelper.Initialization(new ImClientOptions { Redis = new CSRedis.CSRedisClient("118.25.209.177:26379,idleTimeout=3000,poolsize=5"), Servers = new[] { "127.0.0.1:6001" } }); ImHelper.Instance.OnSend += (s, e) => Console.WriteLine($"ImClient.SendMessage(server={e.Server},data={JsonConvert.SerializeObject(e.Message)})"); ImHelper.EventBus( t => { Console.WriteLine(t.clientId + "上线了"); var onlineUids = ImHelper.GetClientListByOnline(); ImHelper.SendMessage(t.clientId, onlineUids, $"用户{t.clientId}上线了"); }, t => Console.WriteLine(t.clientId + "下线了")); }
public void Configure(IApplicationBuilder app) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.OutputEncoding = Encoding.GetEncoding("GB2312"); Console.InputEncoding = Encoding.GetEncoding("GB2312"); app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseEndpoints(config => config.MapControllers()); app.UseDefaultFiles(); app.UseStaticFiles(); ImHelper.Initialization(new ImClientOptions { Redis = new FreeRedis.RedisClient("127.0.0.1:6379,password=cTelHhQMFrw4R699rts00du8JW0CKF,defaultDatabase=0,poolsize=500,ssl=false,writeBuffer=10240"), Servers = new[] { "127.0.0.1:5000" } }); ImHelper.Instance.OnSend += (s, e) => Console.WriteLine($"ImClient.SendMessage(server={e.Server},data={JsonConvert.SerializeObject(e.Message)})"); ImHelper.EventBus( t => { Console.WriteLine(t.clientId + "上线了"); //var onlineUids = ImHelper.GetClientListByOnline(); //ImHelper.SendMessage(t.clientId, onlineUids, $"用户{t.clientId}上线了"); }, t => Console.WriteLine(t.clientId + "下线了")); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.OutputEncoding = Encoding.GetEncoding("GB2312"); Console.InputEncoding = Encoding.GetEncoding("GB2312"); loggerFactory.AddConsole(LogLevel.Error); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseDefaultFiles(); app.UseStaticFiles(); app.UseMvc(); app.UseSwagger().UseSwaggerUI(); ImHelper.Initialization(new ImClientOptions { Redis = new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=5"), Servers = new[] { "127.0.0.1:6001" } }); ImHelper.Instance.OnSend += (s, e) => Console.WriteLine($"ImClient.SendMessage(server={e.Server},data={JsonConvert.SerializeObject(e.Message)})"); ImHelper.EventBus( t => { Console.WriteLine(t.clientId + "上线了"); var onlineUids = ImHelper.GetClientListByOnline(); ImHelper.SendMessage(t.clientId, onlineUids, $"用户{t.clientId}上线了"); }, t => Console.WriteLine(t.clientId + "下线了")); }
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.成功); }
public APIReturn 出牌([FromForm] string id, [FromForm] string playerId, [FromForm] int[] poker) { var ddz = DDZGet(id); ddz.Play(playerId, poker); object[] gpdb = null; using (var pipe = redis.StartPipe()) { pipe.HGet <Player[]>($"ddz_gameplay_ht{ddz.Id}", "players"); pipe.HGet <Desk>($"ddz_gameplay_ht{ddz.Id}", "desk"); gpdb = pipe.EndPipe(); } var players = gpdb[0] as Player[]; var desk = gpdb[1] as Desk; SendGameMessage(ddz, gpdb[0] as Player[]); if (ddz.Data.stage == GameStage.游戏结束) { ImHelper.LeaveChan(players[0].Id, desk.Title); ImHelper.LeaveChan(players[1].Id, desk.Title); ImHelper.LeaveChan(players[2].Id, desk.Title); } return(APIReturn.成功); }
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]})" }); } }
async public Task <APIReturn> SendChannelMsg([FromForm] string channel, [FromForm] string message) { await CheckPlayer(); ImHelper.SendChanMessage(CurrentPlayer.Id, channel, message); return(APIReturn.成功); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.OutputEncoding = Encoding.GetEncoding("GB2312"); Console.InputEncoding = Encoding.GetEncoding("GB2312"); loggerFactory.AddConsole(LogLevel.Error); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseDefaultFiles(); app.UseStaticFiles(); app.UseMvc(); app.UseSwagger().UseSwaggerUI(); ImHelper.Initialization(new ImClientOptions { Redis = new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=5"), Servers = new[] { "127.0.0.1:6001" } }); ImHelper.EventBus(t => Console.WriteLine(t.clientId + "上线了"), t => Console.WriteLine(t.clientId + "下线了")); }
public async Task <AjaxResult <object> > GetChannels() { return(new AjaxResult <object> { code = 0, data = new { channels = ImHelper.GetChanList().Select(a => new { a.chan, a.online }) } }); }
public object sendmsg([FromForm] Guid senderWebsocketId, [FromForm] Guid receiveWebsocketId, [FromForm] string message, [FromForm] bool isReceipt = false) { ImHelper.SendMessage(senderWebsocketId, new[] { receiveWebsocketId }, message, isReceipt); return(new { code = 0 }); }
public object getChannels() { return(new { code = 0, channels = ImHelper.GetChanList().Select(a => new { a.chan, a.online }) }); }
public object subscrChannel([FromForm] string websocketId, [FromForm] string channel) { ImHelper.JoinChan(websocketId, channel); return(new { code = 0 }); }
public object sendChannelmsg([FromForm] string websocketId, [FromForm] string channel, [FromForm] string message) { ImHelper.SendChanMessage(websocketId, channel, message); return(new { code = 0 }); }
public object getChannels() { return(new { code = 0, channels = ImHelper.GetChanList() }); }
/// <summary> /// 添加朋友 /// </summary> /// <param name="clientId"></param> /// <param name="friendId"></param> /// <returns></returns> public async Task <object> AddFriend(string clientId, string friendId) { ApiResult <object> result = new ApiResult <object>(); await ImHelper.AddFriend(clientId, friendId); result.Msg = "success"; result.Data = new { }; return(result); }
/// <summary> /// 获取用户群聊列表 /// </summary> /// <param name="clientId"></param> /// <returns></returns> public async Task <object> GetUserChanList(string clientId) { ApiResult <object> result = new ApiResult <object>(); var data = await ImHelper.GetUserChanList(clientId); result.Msg = "success"; result.Data = data; return(result); }
/// <summary> /// 处理消息 /// </summary> /// <param name="message"></param> public bool HandleMessage(string message, string queenName) { bool isSuccess = true; try { var(senderClientId, receiveClientId, content, receipt) = JsonConvert.DeserializeObject <(string senderClientId, string[] receiveClientId, string content, bool receipt)>(message as string); var outgoing = new ArraySegment <byte>(Encoding.UTF8.GetBytes(content)); foreach (var clientId in receiveClientId) { if (ImServer._clients.TryGetValue(clientId, out var wslist) == false) { //Console.WriteLine($"websocket{clientId} 离线了,{data.content}" + (data.receipt ? "【需回执】" : "")); if (!string.IsNullOrWhiteSpace(senderClientId) && clientId != senderClientId && receipt) { ImHelper.SendMessage(clientId, new[] { senderClientId }, queenName, new { content, receipt = "用户不在线" }); } continue; } ImServer.ImServerClient[] sockarray = wslist.Values.ToArray(); //如果接收消息人是发送者,并且接收者只有1个以下,则不发送 //只有接收者为多端时,才转发消息通知其他端 if (clientId == senderClientId && sockarray.Length <= 1) { continue; } foreach (var sh in sockarray) { sh.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None); } if (string.IsNullOrWhiteSpace(senderClientId) && clientId != senderClientId && receipt) { ImHelper.SendMessage(clientId, new[] { senderClientId }, queenName, new { content, receipt = "发送成功" }); } Log.Information(message); } } catch (Exception ex) { isSuccess = false; Log.Error(message, "发送失败", ex.Message); } return(isSuccess); }
public async Task <AjaxResult <object> > MsgRead([FromForm] Guid from, [FromForm] Guid to) { await _msgManager.Read(Appid, from.ToString(), to.ToString()); int ope = -1; ImHelper.SendMessage(from, new[] { to }, new { ope, to, from }, false); return(new AjaxResult <object>()); }
async public Task <APIReturn> PrevConnectWebsocket() { await CheckPlayer(); if (ImHelper.HasOnline(CurrentPlayer.Id)) { return(APIReturn.失败.SetMessage($"用户 {CurrentPlayer.Nick} 已在线,测试请使用多种浏览器模拟真实场景")); } var wsserver = ImHelper.PrevConnectServer(CurrentPlayer.Id, "nil"); ImHelper.JoinChan(CurrentPlayer.Id, "ddz_chan"); return(APIReturn.成功.SetData("server", wsserver)); }
/// <summary> /// 加入群聊 /// </summary> /// <param name="chanName"></param> /// <param name="clientId"></param> /// <returns></returns> public async Task <object> JoinChan(string chanName, string clientId) { ApiResult <object> result = new ApiResult <object>(); var(status, msg) = await ImHelper.JoinChan(chanName, clientId); if (!status) { result.Code = 1; } result.Msg = msg; result.Data = new { }; return(result); }
public object preConnect([FromForm] string websocketId) { if (websocketId == null) { websocketId = Guid.NewGuid().ToString(); } var wsserver = ImHelper.PrevConnectServer(websocketId, this.Ip); return(new { code = 0, server = wsserver, websocketId = websocketId }); }
public async Task <object> SendMessage([FromBody] Packet packet) { ApiResult <object> result = new ApiResult <object>(); var grain = _client.GetGrain <IChatGrain>(packet.SendId); var(status, msg) = await ImHelper.SendMessage(packet); if (!status) { result.Code = 1; } result.Msg = msg; result.Data = new { }; return(result); }
public async Task <AjaxResult <bool> > HasOnline([FromForm] Guid accid) { if (accid == Guid.Empty) { return(new AjaxResult <bool>("accid未空")); } if (!ImHelper.HasOnline(accid)) { return(new AjaxResult <bool>(false)); } else { return(new AjaxResult <bool>(true)); } }
public async Task <AjaxResult <object> > ConnectServer([FromForm] Guid accid) { if (accid == Guid.Empty) { return(new AjaxResult <object>("accid未空")); } //判断是否存在 if (!await _userManager.CheckAccid(accid.ToString(), Appid)) { return(new AjaxResult <object>("accid不存在")); } //获取token var wsserver = ImHelper.PrevConnectServer(accid, this.Ip); return(new AjaxResult <object>((object)wsserver)); }
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); }
public object sendmsg([FromForm] string senderWebsocketId, [FromForm] string receiveWebsocketId, [FromForm] string message, [FromForm] bool isReceipt = false) { //var loginUser = 发送者; //var recieveUser = User.Get(receiveWebsocketId); //if (loginUser.好友 != recieveUser) throw new Exception("不是好友"); ImHelper.SendMessage(senderWebsocketId, new[] { receiveWebsocketId }, message, isReceipt); //loginUser.保存记录(message); //recieveUser.保存记录(message); return(new { code = 0 }); }
//游戏环节 public static void SendGameMessage(GamePlay game, Player[] players) { if (players == null) { players = redis.HGet <Player[]>($"ddz_gameplay_ht{game.Id}", "players"); } foreach (var player in players) { ImHelper.SendMessage(Guid.Empty, new[] { player.Id }, new { type = "GamePlay", ddzid = game.Id, data = game.Data.CloneToPlayer(player.Nick) }); } }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseStaticFiles(); app.UseSwagger().UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs"); c.DocExpansion(DocExpansion.None); }); ImHelper.Initialization(new ImClientOptions { Redis = new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=5"), Servers = new[] { "127.0.0.1:6001" } }); ImHelper.Instance.OnSend += (s, e) => Console.WriteLine($"ImClient.SendMessage(server={e.Server},data={JsonConvert.SerializeObject(e.Message)})"); ImHelper.EventBus( t => { Console.WriteLine(t.clientId + "上线了"); var onlineUids = ImHelper.GetClientListByOnline(); ImHelper.SendMessage(t.clientId, onlineUids, $"用户{t.clientId}上线了"); }, t => Console.WriteLine(t.clientId + "下线了")); app.UseHttpsRedirection(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
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))); }