예제 #1
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                StringHelper.PrintHelp();
                return;
            }

            Connections = new ActiveConnections();
            string userName = args[0];


            string       url            = "http://localhost:5000/communicator";
            var          jsonSerializer = new JsonSerializer();
            IEventSource source         = EventSourceFactory.Get(url);

            source.Connect().GetAwaiter().GetResult();
            string connectionId = source.GetConnectionId().GetAwaiter().GetResult();

            List <KeyValue> mtdt = new List <KeyValue>();

            mtdt.Set("user", userName);
            mtdt.Set("id", connectionId);

            var sender      = source.GetEventSender();
            var observables = source.GetObservablesFactory();

            sender.String(new EventInfo("UserConnected"), new StringMessage(connectionId, mtdt));
            Connections.AddUser(mtdt);
            Console.WriteLine($"Welcome: {userName}!");
            Action help = () => Console.WriteLine("keywords [ help, users, clear, file, to, person, quit ]");

            help();

            var onDisconnected = observables.GetOnDisconnected();
            var onConnected    = observables.GetString("UserConnected");
            var onChat         = observables.GetString("Chat");
            var onFile         = observables.GetBinary("File");
            var onPerson       = observables.GetSerialized <Person>("Person", jsonSerializer);

            onConnected.Subscribe(m => Connections.AddUser(m.MetaData));
            onChat.Subscribe(m => Connections.AddUser(m.MetaData));
            onFile.Subscribe(m => Connections.AddUser(m.MetaData));
            onPerson.Subscribe(m => Connections.AddUser(m.MetaData));

            onConnected.Subscribe(msg => {
                string user = msg.MetaData.Get("user");
                Console.WriteLine($" User {user} joined!");
            });


            onDisconnected.Subscribe(id => Connections.Remove(id));

            onChat.Subscribe((msg) =>
            {
                var md      = msg.MetaData;
                string user = md.Get("user");
                $"{user}: {msg.Data}".Print();
            });

            onFile.Subscribe((msg) =>
            {
                var md          = msg.MetaData;
                string user     = md.Get("user");
                string fileName = md.Get("fileName");
                $"{user}: {fileName} length {msg.Data.Length}".Print();
            });

            onPerson.Subscribe((msg) =>
            {
                var md      = msg.MetaData;
                string user = md.Get("user");
                $"{user}: Person {{ Name = {msg.Data.Name}, Age = {msg.Data.Age} }}".Print();
            });


            string message = "Connected";
            string path    = string.Empty;
            string to      = string.Empty;
            bool   exit    = false;

            do
            {
                message = $"{Environment.NewLine}{StringHelper.DefaultPrompt}".Prompt().Trim();

                switch (message)
                {
                case "help":
                    help();
                    break;

                case "users":
                    Connections.Print();
                    break;

                case "clear":
                    Console.Clear();
                    break;

                case "quit":
                    sender.String(new EventInfo("Chat"), new StringMessage("Disconnected", mtdt));
                    return;

                case "file":
                    path = "Enter path: ".Prompt();
                    if (File.Exists(path))
                    {
                        byte[] bytes = System.IO.File.ReadAllBytes(path);
                        mtdt.SetFileInfo(path);
                        sender.Binary(new EventInfo("File"), new BinaryMessage(bytes, mtdt));
                    }
                    break;

                case "to":
                    string user = "******".Prompt();
                    to = Connections.FindId(user);
                    if (!string.IsNullOrWhiteSpace(to))
                    {
                        message = $"Private message for {user}: ".Prompt();
                        sender.String(new EventInfo("Chat", to, null), new StringMessage(message, mtdt));
                    }
                    else
                    {
                        Console.WriteLine($"User not found: {user}");
                    }
                    break;

                case "person":
                    string name   = "Person Name: ".Prompt();
                    string ageStr = "Person Age: ".Prompt();
                    int    age    = 0;
                    int.TryParse(ageStr.Trim(), out age);
                    Person p = new Person()
                    {
                        Name = name, Age = age
                    };
                    sender.Serialized(new EventInfo("Person"), new StringSerializedMessage <Person>(p, mtdt), jsonSerializer);
                    break;

                default:
                    sender.String(new EventInfo("Chat"), new StringMessage(message, mtdt));
                    break;
                }
            }while (!exit);
        }