public override void ExecuteCommand(ChatSession session, StringRequestInfo requestInfo) { var frame = MsgFrame.Parse(requestInfo.Body); session.Logger.DebugFormat("{0} {1} {2}", session.UserName ?? "--", requestInfo.Key, requestInfo.Body); MsgUtil.SendAll(session, frame); }
private List <DebugVariable> TupleToVariables(MsgFrame frame) { var variables = new List <DebugVariable>(); NodeDebugInfo node = null; RuleDebugInfo rule = null; if (frame.NodeId != 0) { node = DebugInfo.Nodes[frame.NodeId]; if (node.RuleId != 0) { rule = DebugInfo.Rules[node.RuleId]; } } for (var i = 0; i < frame.Tuple.Column.Count; i++) { var value = frame.Tuple.Column[i]; var variable = new DebugVariable { Name = Formatter.TupleVariableIndexToName(rule, node, i), // TODO type name! Type = value.TypeId.ToString(), Value = Formatter.ValueToString(value), TypedValue = value }; variables.Add(variable); } return(variables); }
public static void SendAll(ChatSession session, MsgFrame frame) { foreach (var chatSession in session.AppServer.GetSessions(sess => sess.SessionID != session.SessionID)) { Send(chatSession, frame); } }
public string GetFrameDebugName(MsgFrame frame) { string frameType; switch (frame.Type) { case MsgFrame.Types.FrameType.IsValid: frameType = "IsValid"; break; case MsgFrame.Types.FrameType.Pushdown: frameType = "Pushdown"; break; case MsgFrame.Types.FrameType.PushdownDelete: frameType = "PushdownDelete"; break; case MsgFrame.Types.FrameType.Insert: frameType = "Insert"; break; case MsgFrame.Types.FrameType.Delete: frameType = "Delete"; break; case MsgFrame.Types.FrameType.RuleAction: frameType = "RuleAction"; break; case MsgFrame.Types.FrameType.GoalInitAction: frameType = "GoalInitAction"; break; case MsgFrame.Types.FrameType.GoalExitAction: frameType = "GoalExitAction"; break; default: throw new InvalidOperationException($"Unsupported frame type: {frame.Type}"); } if (frame.NodeId != 0) { string dbName = ""; var node = DebugInfo.Nodes[frame.NodeId]; if (node.DatabaseId != 0) { var db = DebugInfo.Databases[node.DatabaseId]; dbName = db.Name; } else if (node.Name != null && node.Name.Length > 0) { dbName = node.Name; } if (dbName != "") { return($"{frameType} @ {node.Type} (DB {dbName})"); } else { return($"{frameType} @ {node.Type}"); } } else { var goal = DebugInfo.Goals[frame.GoalId]; return($"{frameType} @ {goal.Name}"); } }
public string TupleToString(MsgFrame frame) { string tuple = ""; var node = DebugInfo.Nodes[frame.NodeId]; RuleDebugInfo rule = null; if (node.RuleId != 0) { rule = DebugInfo.Rules[node.RuleId]; } for (var i = 0; i < frame.Tuple.Column.Count; i++) { var value = frame.Tuple.Column[i]; string columnName = TupleVariableIndexToName(rule, node, i); string valueStr; switch ((Value.Type)value.TypeId) { case Value.Type.None: valueStr = "(None)"; break; case Value.Type.Integer: case Value.Type.Integer64: valueStr = value.Intval.ToString(); break; case Value.Type.Float: valueStr = value.Floatval.ToString(); break; case Value.Type.String: case Value.Type.GuidString: default: valueStr = value.Stringval; break; } if (columnName.Length > 0) { tuple += String.Format("{0}={1}, ", columnName, valueStr); } else { tuple += String.Format("{0}, ", valueStr); } } return(tuple); }
public string GetFrameName(MsgFrame frame, MsgTuple arguments) { switch (frame.Type) { case MsgFrame.Types.FrameType.GoalInitAction: { var goal = DebugInfo.Goals[frame.GoalId].Name; return(goal + " (INIT)"); } case MsgFrame.Types.FrameType.GoalExitAction: { var goal = DebugInfo.Goals[frame.GoalId].Name; return(goal + " (EXIT)"); } case MsgFrame.Types.FrameType.Insert: case MsgFrame.Types.FrameType.Delete: { string argumentsFmt = ""; if (arguments != null) { argumentsFmt = "(" + TupleToString(arguments) + ")"; } var node = DebugInfo.Nodes[frame.NodeId]; if (node.Type == Node.Type.Database) { var db = DebugInfo.Databases[node.DatabaseId]; if (frame.Type == MsgFrame.Types.FrameType.Insert) { return(db.Name + argumentsFmt + " (INSERT)"); } else { return(db.Name + argumentsFmt + " (DELETE)"); } } else { return(node.Name + argumentsFmt); } } default: throw new InvalidOperationException($"Unsupported root frame type: {frame.Type}"); } }
public override void ExecuteCommand(ChatSession session, StringRequestInfo requestInfo) { var result = new MsgInfo(MsgType.JOIN_RESULT); var frame = MsgFrame.Parse(requestInfo.Body); var msg = MsgInfo.FromFrame(new[] { frame }); var username = msg.FromUser; // 用户未输入昵称 if (string.IsNullOrWhiteSpace(username)) { result.Success = false; result.Message = "Please enter your Nickname."; MsgUtil.Send(session, result); return; } var sessions = session.AppServer.GetSessions(_ => !string.IsNullOrWhiteSpace(_.UserName)).ToList(); // 昵称已经存在 if (sessions.Any(_ => _.UserName.Equals(username, StringComparison.OrdinalIgnoreCase))) { result.Success = false; result.Message = "Nickname [" + username + "] exists, please get another one."; MsgUtil.Send(session, result); return; } // 昵称不存在,可以加入聊天 session.UserName = username; // 返回当前的用户列表 var users = sessions.Where(sess => sess.SessionID != session.SessionID) .Select(sess => sess.UserName); result.Data = string.Join(",", users).ToBin(); MsgUtil.Send(session, result); // 通知其它用户 MsgUtil.SendAll(session, new MsgInfo(MsgType.NEW_JOIN) { FromUser = session.UserName }); }
/// <summary> /// 一对一发消息 /// </summary> /// <param name="session"></param> /// <param name="requestInfo"></param> public override void ExecuteCommand(ChatSession session, StringRequestInfo requestInfo) { var result = new MsgInfo(MsgType.SEND_RESULT); session.Logger.DebugFormat("{0} {1} {2}", session.UserName ?? "--", requestInfo.Key, requestInfo.Body); var frame = MsgFrame.Parse(requestInfo.Body); var toSession = session.AppServer.GetSessions(_ => _.UserName == frame.Target).FirstOrDefault(); if (toSession == null) { result.Success = false; result.Message = "User is not online."; MsgUtil.Send(session, result); return; } MsgUtil.Send(toSession, frame); }
private CoalescedFrame MsgFrameToLocal(MsgFrame frame) { var outFrame = new CoalescedFrame(); outFrame.Name = Formatter.GetFrameDebugName(frame); if (frame.Type == MsgFrame.Types.FrameType.GoalInitAction || frame.Type == MsgFrame.Types.FrameType.GoalExitAction) { var goal = DebugInfo.Goals[frame.GoalId]; outFrame.File = goal.Path; if (frame.Type == MsgFrame.Types.FrameType.GoalInitAction) { outFrame.Line = (int)goal.InitActions[(int)frame.ActionIndex].Line; } else { outFrame.Line = (int)goal.ExitActions[(int)frame.ActionIndex].Line; } } else if (frame.NodeId != 0) { var node = DebugInfo.Nodes[frame.NodeId]; if (node.RuleId != 0) { var rule = DebugInfo.Rules[node.RuleId]; var goal = DebugInfo.Goals[rule.GoalId]; outFrame.File = goal.Path; if (frame.Type == MsgFrame.Types.FrameType.Pushdown && node.Type == Node.Type.Rule) { outFrame.Line = (int)rule.ActionsStartLine; } else if (frame.Type == MsgFrame.Types.FrameType.RuleAction) { outFrame.Line = (int)rule.Actions[(int)frame.ActionIndex].Line; } else { outFrame.Line = node.Line; } } } outFrame.Variables = TupleToVariables(frame); outFrame.Frame = frame; if (outFrame.File != null && ModUuid != null) { var modRe = new Regex(".*\\.pak:/Mods/.*/Story/RawFiles/Goals/(.*)\\.txt"); var match = modRe.Match(outFrame.File); if (match.Success) { outFrame.File = "divinity:/" + ModUuid + "/" + match.Groups[1].Value + ".divgoal"; } } return(outFrame); }
// ----------------------------------------------------------------------------------- // Awake // ----------------------------------------------------------------------------------- public void Awake() { msgFrame = Instantiate(Resources.Load <GameObject>("MsgFrame"), this.transform).GetComponent <MsgFrame>(); }
private void client_DataReceived(object sender, DataEventArgs e) { // 这里要注意: // e.Length 是实际数据的长度 // 如果直接使用 Encoding.UTF8.GetString(e.Data) // 会读取到填充的\0字符,这会引起不可预知的意外 var data = buffer + Encoding.UTF8.GetString(e.Data, 0, e.Length); buffer.Clear(); var temp = data.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); switch (temp.Length) { case 0: return; case 1: data = temp[0]; break; default: data = temp[0]; buffer.Append(temp[1]); break; } var frame = MsgFrame.Parse(data); if (Cache.Check(frame)) { return; } var msg = MsgInfo.FromFrame(Cache.Get(frame.Id)); switch (msg.Type) { case MsgType.JOIN_RESULT: // 加入结果 // 加入成功 if (msg.Success) { // 更新标题 Text = "Client - " + tName.Text; if (msg.Data != null && msg.Data.Length != 0) { list.Items.Clear(); var onlineusers = msg.Data.ToStr().Split(",".ToArray()); foreach (var item in onlineusers) { AddUser(item); } } AppendNotify("U can enjoy the chat now"); } else { client.Close(); bConnect.Text = "Connect"; AppendNotify(msg.Message); } break; case MsgType.NEW_JOIN: // 有新用户加入 AppendNotify(string.Format("User {0} join", msg.FromUser)); AddUser(msg.FromUser); break; case MsgType.SEND_RESULT: // 发送消息结果 if (!msg.Success) { AppendNotify(msg.Message); } break; case MsgType.MSG: // 收到消息 AppendMsg(msg, false); break; case MsgType.QUIT: // 用户退出 AppendNotify(string.Format("User {0} leave", msg.FromUser)); RemoveUser(msg.FromUser); break; } }
public static void Send(ChatSession session, MsgFrame frame) { var temp = frame.ToString(); session.Send(temp); }