/// <summary> /// 发送弹幕 (注意:是直接将弹幕json对象作为参数传了过来,而不是经过JSON.stringify()后的json字符串) /// </summary> /// <param name="danmakuObj">弹幕json对象</param> public void SendDanmaku(Model.Danmaku danmakuObj) { #region 保存弹幕到本地, 并将弹幕发送给所有客户端 string saveFilePath = @"C:\wwwroot\api.moeci.com\danmakuList.txt"; if (!File.Exists(saveFilePath)) { File.Create(saveFilePath); } System.Web.Script.Serialization.JavaScriptSerializer javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string danmakuJsonStr = string.Empty; if (danmakuObj.Stime == 0) { // Stime说明没有带stime,为send发出的弹幕 var danmakuJsonObj = new { mode = danmakuObj.Mode, text = danmakuObj.Text, size = danmakuObj.Size, color = danmakuObj.Color }; Clients.All.sendTipMsg("-----服务端发送消息啦------"); //Clients.All.sendDanmaku(danmakuJsonObj); //Clients.All.sendTipMsg(danmakuJsonObj); // 给自己发带边框的,给其它人发不带边框的(这种是无记录模式,其实是通过发送时调用此方法的则为发送弹幕者,以前自己发的弹幕并不会标识为自己发的(带边框)) Clients.Client(Context.ConnectionId).sendDanmaku(new { mode = danmakuObj.Mode, text = danmakuObj.Text, size = danmakuObj.Size, color = danmakuObj.Color, border = true }); Clients.Others.sendDanmaku(danmakuJsonObj); Clients.Client(Context.ConnectionId).sendTipMsg(new { mode = danmakuObj.Mode, text = danmakuObj.Text, size = danmakuObj.Size, color = danmakuObj.Color, border = true }); Clients.Others.sendTipMsg(danmakuJsonObj); danmakuJsonStr = javaScriptSerializer.Serialize(danmakuJsonObj); } else { // 有Stime说明为 insert 发出的弹幕 var danmakuJsonObj = new { mode = danmakuObj.Mode, text = danmakuObj.Text, stime = danmakuObj.Stime, size = danmakuObj.Size, color = danmakuObj.Color }; Clients.All.sendTipMsg("-----服务端发送消息啦------"); //Clients.All.sendDanmaku(danmakuJsonObj); //Clients.All.sendTipMsg(danmakuJsonObj); Clients.Client(Context.ConnectionId).sendDanmaku(new { mode = danmakuObj.Mode, text = danmakuObj.Text, stime = danmakuObj.Stime, size = danmakuObj.Size, color = danmakuObj.Color, border = true }); Clients.Others.sendDanmaku(danmakuJsonObj); Clients.Client(Context.ConnectionId).sendTipMsg(new { mode = danmakuObj.Mode, text = danmakuObj.Text, stime = danmakuObj.Stime, size = danmakuObj.Size, color = danmakuObj.Color, border = true }); Clients.Others.sendTipMsg(danmakuJsonObj); danmakuJsonStr = javaScriptSerializer.Serialize(danmakuJsonObj); } File.AppendAllText(saveFilePath, danmakuJsonStr + "\n\r", System.Text.Encoding.UTF8); #endregion }
protected void ProcessNotice(string rawMessage) { var json = JObject.Parse(rawMessage); ReceiveNotice?.Invoke(this, new ReceiveNoticeEventArgs { RawMessage = rawMessage, JsonMessage = json }); //Debug.WriteLine(rawMessage); switch (json["cmd"].ToString()) { case "DANMU_MSG": var danmaku = new Model.Danmaku { UserID = json["info"][2][0].Value <int>(), UserName = json["info"][2][1].ToString(), Text = json["info"][1].ToString(), IsAdmin = json["info"][2][2].ToString() == "1", IsVIP = json["info"][2][3].ToString() == "1", UserGuardLevel = json["info"][7].Value <int>() }; ReceiveDanmaku?.Invoke(this, new ReceiveDanmakuEventArgs { Danmaku = danmaku, JsonMessage = json, RawMessage = rawMessage }); //Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{RoomID}]-弹幕:{(danmaku.IsAdmin?"房":"")}{(danmaku.IsVIP?"爷":"")} {danmaku.UserName + ":"}{danmaku.Text}"); break; case "SEND_GIFT": var gift = new Gift { GiftName = json["data"]["giftName"].ToString(), UserName = json["data"]["uname"].ToString(), UserID = json["data"]["uid"].ToObject <int>(), GiftCount = json["data"]["num"].ToObject <int>() }; ReceiveGift?.Invoke(this, new ReceiveGiftEventArgs { Gift = gift, JsonMessage = json, RawMessage = rawMessage }); break; case "ROOM_REAL_TIME_MESSAGE_UPDATE": break; case "INTERACT_WORD": //Console.WriteLine(rawMessage); break; case "ONLINERANK": break; case "LIVE": LiveStart?.Invoke(this, null); break; case "PREPARING": break; case "CUT": break; case "SEND_TOP": break; case "ROOM_RANK": break; } }