Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
 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}");
            }
        }
Example #7
0
        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
            });
        }
Example #8
0
        /// <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);
        }
Example #9
0
        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);
        }
Example #10
0
 // -----------------------------------------------------------------------------------
 // Awake
 // -----------------------------------------------------------------------------------
 public void Awake()
 {
     msgFrame = Instantiate(Resources.Load <GameObject>("MsgFrame"), this.transform).GetComponent <MsgFrame>();
 }
Example #11
0
        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;
            }
        }
Example #12
0
        public static void Send(ChatSession session, MsgFrame frame)
        {
            var temp = frame.ToString();

            session.Send(temp);
        }