private void HandleConnMessage(Connection connection, User user, Packet packet)
        {
            if (packet.Id == PacketId.SendMessage)
            {
                var msg = new Message();
                msg.FromJson(packet.Information);
                if (msg.Content.Length > 256)
                {
                    msg         = new Message();
                    msg.Content = $"Error: Message was too long";
                    msg.Author  = Menu.Server.SERVERUSER;
                    msg.Colour  = System.Drawing.Color.Red;
                    SendTo(user, new Packet(PacketId.NewMessage, msg.ToJson()));
                    return;
                }
                if (string.IsNullOrWhiteSpace(msg.Content))
                {
                    msg         = new Message();
                    msg.Content = $"Error: Message was empty, whitespace or null.";
                    msg.Author  = Menu.Server.SERVERUSER;
                    msg.Colour  = System.Drawing.Color.Red;
                    SendTo(user, new Packet(PacketId.NewMessage, msg.ToJson()));
                    return;
                }
                if (user.SavedValues.TryGetValue("muted", out var val) && bool.TryParse(val, out var muted) && muted)
                {
                    msg         = new Message();
                    msg.Content = $"Error: you are muted";
                    msg.Author  = Menu.Server.SERVERUSER;
                    msg.Colour  = System.Drawing.Color.Red;
                    SendTo(user, new Packet(PacketId.NewMessage, msg.ToJson()));
                    return;
                }


                msg.Id = Common.IterateMessageId();
                Common.AddMessage(msg);
                NewMessage?.Invoke(this, msg); // so Server can see all messages
                if (msg.Content.StartsWith("/"))
                {                              // command, so we dont broadcast to all users
                    try
                    {
                        Menu.Server.Commands.Execute(msg);
                    } catch (Exception ex)
                    {
                        Logger.LogMsg(ex.ToString(), LogSeverity.Error);
                        var reply = new Classes.Message();
                        reply.Author = Menu.Server.SERVERUSER;
                        reply.Id     = Common.IterateMessageId();
                        reply.Colour = System.Drawing.Color.Red;
                        SendTo(user, new Packet(PacketId.NewMessage, reply.ToJson()));
                    }
                }
                else
                { // non-command, so we broadcast
                    var pong = new Packet(PacketId.NewMessage, msg.ToJson());
                    Broadcast(pong);
                }
            }
            else if (packet.Id == PacketId.Disconnect)
            {
                HandleConnDisconnect(connection, new Exception("User self-disconnected"));
            }
            else if (packet.Id == PacketId.RequestDeleteMessage)
            {
                var id = packet.Information["id"].ToObject <uint>();
                if (Common.TryGetMessage(id, out var msg))
                {
                    if (msg.Author.Id != user.Id && user.Id != Menu.Server.SERVERUSER.Id)
                    {
                        var errMsg = new Message();
                        errMsg.Author  = Menu.Server.SERVERUSER;
                        errMsg.Id      = 0;
                        errMsg.Content = $"Error: Cannot delete message since you are not the author";
                        errMsg.Colour  = Color.Red;
                        SendTo(user, new Packet(PacketId.NewMessage, errMsg.ToJson()));
                        return;
                    }
                    var jobj = new JObject();
                    jobj["id"] = id;
                    var pong = new Packet(PacketId.MessageDeleted, jobj);
                    Broadcast(pong);
                }
            }
            else if (packet.Id == PacketId.RequestEditMessage)
            {
            }
            else if (packet.Id == PacketId.RequestUploadImage)
            {
                var image = new Classes.Image();
                image.FromJson(packet.Information);
                if ((Menu.Client?.Client?.CurrentUser?.Id ?? (uint)0) == user.Id)
                { // Local user, so no need to upload image (since its already there)
                    if (Common.TryGetImage(image.Id, out var old))
                    {
                        Common.Images.Remove(image.Id);
                        old.Id = Common.IterateImageId();
                        Common.AddImage(old);
                        image = old;
                    }
                    var otherPacket = new Packet(PacketId.ImageInitialInformation, image.ToJson(true));
                    Broadcast(otherPacket);
                    return;
                }
                var jobj = new JObject();
                jobj["slice"]      = 0;
                jobj["originalId"] = image.Id;
                image.Id           = Common.IterateImageId();
                Common.AddImage(image);
                jobj["id"] = image.Id;
                var pongPacket = new Packet(PacketId.ImageNeedSlice, jobj);
                SendTo(user, pongPacket);
            }
            else if (packet.Id == PacketId.ImageSlice)
            {
                var id       = packet.Information["id"].ToObject <uint>();
                var sliceNum = packet.Information["slice"].ToObject <int>();
                var done     = packet.Information["done"].ToObject <bool>();
                var content  = packet.Information["data"].ToObject <string>();
                if (Common.TryGetImage(id, out var image))
                {
                    image.SetSlice(sliceNum, content);
                    if (done)
                    {
                        var      loadedImage = System.Drawing.Image.FromStream(image.GetStream());
                        string[] pathDirs    = image.Path.Split('/');
                        pathDirs = pathDirs.Reverse().Skip(1).Reverse().ToArray();
                        string temp = "";
                        foreach (var path in pathDirs)
                        {
                            temp += path + "/";
                            if (!Directory.Exists(temp))
                            {
                                Directory.CreateDirectory(temp);
                            }
                        }
                        loadedImage.Save(image.Path);
                        var otherPacket = new Packet(PacketId.ImageInitialInformation, image.ToJson(true));
                        Broadcast(otherPacket);
                    }
                    else
                    {
                        var jobj = new JObject();
                        jobj["id"]    = image.Id;
                        jobj["slice"] = sliceNum + 1;
                        var pongPacket = new Packet(PacketId.ImageNeedSlice, jobj);
                        SendTo(user, pongPacket);
                    }
                }
            }
            else if (packet.Id == PacketId.ImageNeedSlice)
            {
                var id       = packet.Information["id"].ToObject <uint>();
                var sliceNum = packet.Information["slice"].ToObject <int>();
                if (Common.TryGetImage(id, out var image))
                {
                    var slice = image.Slices[sliceNum];
                    var jobj  = new JObject(packet.Information);
                    jobj["done"] = (sliceNum == image.Slices.Count - 1);
                    jobj["data"] = slice;
                    var pongPacket = new Packet(PacketId.ImageSlice, jobj);
                    SendTo(user, pongPacket);
                }
            }
            else if (packet.Id == PacketId.NeedUserInfo)
            {
                var id   = packet.Information["id"].ToObject <uint>();
                var usr  = Common.GetUser(id);
                var pong = new Packet(PacketId.RespondUserInfo, usr.ToJson());
                SendTo(user, pong);
            }
        }
Example #2
0
        void parseJson(object sender, string json)
        {
            Logger.LogMsg("Recieved: " + json);
            var packet = new Packet(json);

            if (packet.Id == PacketId.NewMessage)
            {
                var msg = new Message();
                msg.FromJson(packet.Information);

                Form.Invoke(new Action(() =>
                {
                    NewMessage?.Invoke(this, msg);
                }));
            }
            else if (packet.Id == PacketId.GiveIdentity)
            {
                var usr = new User();
                usr.FromJson(packet.Information);
                this.CurrentUser = usr;

                Form.Invoke(new Action(() =>
                {
                    IdentityKnown?.Invoke(this, usr);
                }));
            }
            else if (packet.Id == PacketId.UserUpdate)
            {
                var usr = new User();
                usr.FromJson(packet.Information);
                Form.Invoke(new Action(() =>
                {
                    UserUpdate?.Invoke(this, usr);
                }));
            }
            else if (packet.Id == PacketId.UserLeft)
            {
                var usr = new User();
                usr.FromJson(packet.Information);
                Form.Invoke(new Action(() =>
                {
                    UserDisconnected?.Invoke(this, usr);
                }));
            }
            else if (packet.Id == PacketId.SetMonitorState)
            {
                var state = packet.Information["state"].ToObject <bool>();
                Form.Invoke(new Action(() =>
                {
                    SetMonitorState?.Invoke(this, state);
                }));
            }
            else if (packet.Id == PacketId.Disconnect)
            {
                this.Close();
            }
            else if (packet.Id == PacketId.MessageDeleted)
            {
                var id = packet.Information["id"].ToObject <uint>();
                Form.Invoke(new Action(() =>
                {
                    MessageDeleted?.Invoke(this, id);
                }));
            }
            else if (packet.Id == PacketId.ImageNeedSlice)
            { // Server needs us to send the slice.
                var id        = packet.Information["id"].ToObject <uint>();
                var shiftedId = (uint)0;
                if (packet.Information.TryGetValue("originalId", out var val))
                {
                    shiftedId = id;
                    id        = val.ToObject <uint>();
                }
                var sliceNum = packet.Information["slice"].ToObject <int>();
                if (Common.Images.TryGetValue(id, out var image))
                {
                    if (shiftedId > 0)
                    { // move it into the new location, remove old one.
                        Common.Images[shiftedId] = image;
                    }
                    var slice = image.Slices[sliceNum];
                    var jobj  = new JObject(packet.Information);
                    jobj["done"] = (sliceNum == image.Slices.Count - 1);
                    jobj["data"] = slice;
                    var pongPacket = new Packet(PacketId.ImageSlice, jobj);
                    Send(pongPacket.ToString());
                    Form.Invoke(new Action(() =>
                    {
                        UploadStatus?.Invoke(this, new UploadStatusEvent(image, sliceNum));
                    }));
                }
            }
            else if (packet.Id == PacketId.ImageInitialInformation)
            {
                var image = new Classes.Image();
                image.FromJson(packet.Information);
                if (Common.TryGetImage(image.Id, out var existingImage))
                {
                    if (existingImage.Slices.Count == image.MaximumSlices)
                    { // We already have this image, so we dont need to download it
                        Form.Invoke(new Action(() =>
                        {
                            NewImageUploaded?.Invoke(this, existingImage);
                        }));
                        return;
                    }
                }
                Common.AddImage(image);
                var jobj = new JObject();
                jobj["id"]    = image.Id;
                jobj["slice"] = 0;
                var response = new Packet(PacketId.ImageNeedSlice, jobj);
                Send(response.ToString());
            }
            else if (packet.Id == PacketId.ImageSlice)
            {
                var id       = packet.Information["id"].ToObject <uint>();
                var sliceNum = packet.Information["slice"].ToObject <int>();
                var done     = packet.Information["done"].ToObject <bool>();
                var content  = packet.Information["data"].ToObject <string>();
                if (Common.TryGetImage(id, out var image))
                {
                    image.SetSlice(sliceNum, content);
                    if (done)
                    {
                        Form.Invoke(new Action(() =>
                        {
                            NewImageUploaded?.Invoke(this, image);
                        }));
                    }
                    else
                    {
                        var jobj = new JObject();
                        jobj["id"]    = image.Id;
                        jobj["slice"] = sliceNum + 1;
                        var pongPacket = new Packet(PacketId.ImageNeedSlice, jobj);
                        Send(pongPacket.ToString());
                        Form.Invoke(new Action(() =>
                        {
                            Form.pbProgressBar.Maximum = image.MaximumSlices;
                            Form.pbProgressBar.Value   = sliceNum;
                            Form.pbProgressBar.Tag     = $"Downloading image '{image.Name}'; {sliceNum}/{image.MaximumSlices} {((int)(sliceNum + 1 / image.MaximumSlices + 1))}";
                        }));
                    }
                }
            }
        }