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); } }
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))}"; })); } } } }