private void ModListPacketHandler(Packet pa) { ModListPacket p = pa as ModListPacket; CurrentStep = ProgressStep.DownloadingModInformation; mods = new List<Mod>(p.Mods.Length); Thread.Sleep(250); foreach (string s in p.Mods) { Packet.Send(new RequestModPacket { Type = RequestModPacket.RequestType.Info, Identifier = s }, PacketHandler.Stream); } }
/// <summary> /// Gets the ID of a packet. /// </summary> /// <param name="p"></param> /// <returns></returns> public static PacketId GetPacketId(Packet p) { PacketId id = (PacketId)255; if (p == null) return id; if (Map.TryGetValue(p.GetType(), out id)) return id; throw new KeyNotFoundException(); }
private void AdminFileInfoPacketHandler(Packet pa) { AdminFileInfoPacket p = pa as AdminFileInfoPacket; mods.Add(new Mod { Author = p.Author, File = p.File, Name = p.ModName, Description = p.Description, BlacklistedUsers = new List<string>(p.BlacklistedUsers), WhitelistedUsers = new List<string>(p.WhitelistedUsers), PostDownloadCLI = new List<string>(p.PostDownload), Size = p.FileSize, Hash = p.Hash, Contents = new byte[p.FileSize], //This part will be filled in later. Identifier = p.Identifier, Optional = p.Optional, RequiredMods = new List<string>(p.Requires) }); if (mods.Count == mods.Capacity) CurrentStep = ProgressStep.Connected; }
private void MetadataPacketHandler(Packet pa) { MetadataPacket p = pa as MetadataPacket; switch (p.SData[0]) { case "admin_login": if (p.SData[1] != "true") { FailureMessage = "You are not an admin."; CurrentStep = ProgressStep.LoginFailed; } break; case "server_name": Server.Name = p.SData[1]; break; } }
void ph_NextDownload(Packet pa) { NextDownloadPacket p = pa as NextDownloadPacket; Thread.Sleep(100); progress[1] = 0; progress[2] = p.ChunkSize; CurrentDownload = Mods.Find(p.Identifier); CurrentDownload.Contents = new byte[CurrentDownload.Size]; if(!Server.Shutdown) SplashScreen.UpdateStatusText("Downloading " + CurrentDownload.Name); else SplashScreen.UpdateStatusTextWithStatus("Downloading " + CurrentDownload.Name + "(Server Shutdown Mode)", TypeOfMessage.Warning); MinecraftModUpdater.Logger.Log(Logger.Level.Info, "Starting download of " + CurrentDownload.Name); if(modImages.Images.ContainsKey(CurrentDownload.File)) SplashScreen.GetScreen().setDownloadPicture(modImages.Images[CurrentDownload.File]); CurrentDownload.PostDownload = p.PostDownloadCLI; string path = Properties.Settings.Default.MinecraftPath + "\\" + CurrentDownload.File.Replace(CurrentDownload.File.Split('\\').Last(), "").TrimEnd('\\').Replace("clientmods", "mods"); bool exists = Directory.Exists(path); if (!exists) Directory.CreateDirectory(path); }
private void Handle(Packet pa) { HandshakePacket p = pa as HandshakePacket; if (p.Type == HandshakePacket.SessionType.Server) { Slave sl = new Slave(p, ph); Server.Servers.Add(sl); Console.WriteLine("New Server: " + sl.ToString()); slave = sl; ph.Stream.StreamDisposed += new EventHandler(Stream_StreamDisposed); return; } string[] srvs = new string[Server.Servers.Count]; string[] addrs = new string[Server.Servers.Count]; int[] ports = new int[Server.Servers.Count]; for (int i = 0; i < Server.Servers.Count; i++) { srvs[i] = Server.Servers[i].Name; addrs[i] = Server.Servers[i].Address.ToString(); ports[i] = Server.Servers[i].Port; } Packet.Send(new ServerListPacket { Servers = srvs, Locations = addrs, Ports = ports }, ph.Stream); ph.Stop(); ClientDisconnected(this, EventArgs.Empty); }
void ph_ModInfo(Packet pa) { ModInfoPacket p = pa as ModInfoPacket; Mod m = new Mod { Author = p.Author, File = p.File, Name = p.ModName, Hash = p.Hash, Size = p.FileSize, Description = p.Description, Identifier = p.Identifier, Optional = p.Optional, Requires = p.Requires.ToList() }; if (m.Optional) { OptionalMods.Add(m); } else { Mods.Add(m); } string path = Path.GetDirectoryName(Properties.Settings.Default.MinecraftPath + "\\" + p.File); string s = ""; bool exists = File.Exists(path + "\\" + Path.GetFileName(m.File)); if (exists) { try { s = Extras.GenerateHash(path + "\\" + Path.GetFileName(m.File)); } catch (Exception e) { MinecraftModUpdater.Logger.Log(e); } } if ((!exists && !m.Optional) || (s != m.Hash && !m.Optional)) { Program.RunOnUIThread(delegate { lsModsToUpdate.Items.Add(m); }); } else if (!m.Optional) { Program.RunOnUIThread(delegate { lsMods.Items.Add(m); }); } if (exists && m.Optional && s == m.Hash) { Mods.Add(m); Program.RunOnUIThread(delegate { lsMods.Items.Add(m); }); } else if (exists && m.Optional && s != m.Hash) { Mods.Add(m); Program.RunOnUIThread(delegate { lsModsToUpdate.Items.Add(m); }); } MinecraftModUpdater.Logger.Log(Logger.Level.Debug, "Info: " + m.Name); string str = GetLastModId(); if (str == m.Identifier) { foreach (string str1 in Directory.GetFiles(Properties.Settings.Default.MinecraftPath + @"\mods")) { string str2 = @"mods\" + Path.GetFileName(str1); Mod mod = Mods.FindFromFile(str2); bool file = mod != null; if (!file) Program.RunOnUIThread(delegate { lsModsToDelete.Items.Add(Path.GetFileName(str1)); }); } } if (str == m.Identifier && Properties.Settings.Default.AutoUpdate) { Program.RunOnUIThread(delegate { btnConfirm_Click(null, null); }); } else if (str == m.Identifier) { List<Mod> allMods = new List<Mod>(); allMods.AddRange(Mods); allMods.AddRange(OptionalMods); foreach (Mod mod in Mods) { mod.BuildRequiredByList(allMods.ToArray().ToList()); //Just so that we don't modify the mod list. } foreach (Mod mod in OptionalMods) { mod.BuildRequiredByList(allMods.ToArray().ToList()); //Just so that we don't modify the mod list. } Program.RunOnUIThread(delegate { SplashScreen.CloseSplashScreen(); Show(); }); } else if(str != m.Identifier && !Properties.Settings.Default.AutoUpdate) { Program.RunOnUIThread(delegate { if (Visible) Hide(); }); } }
private void HandleDownloadInfo(Packet pa) { NextDownloadPacket p = pa as NextDownloadPacket; currentDownload = mods.IndexOf(mods.Find(new Predicate<Mod>(delegate(Mod m) { return m.Identifier == p.Identifier; }))); //I know, get the mod so we can get the index so we can get the mod. }
void ph_Image(Packet pa) { ImagePacket p = pa as ImagePacket; Image i = Extras.ImageFromBytes(p.Image); if (p.Type == ImagePacket.ImageType.Background) { SplashScreen.BackgroundImage = i; if (SplashScreen.GetScreen() != null) { SplashScreen.GetScreen().Image.Image = i; } } else { modImages.Images.Add(p.ShowOn, i); } }
void ph_Metadata(Packet pa) { MetadataPacket p = pa as MetadataPacket; StringBuilder sb = new StringBuilder(); for (int i = 0; i < p.SData.Length; i++) { sb.AppendFormat("StringData {0}: {1}\r\n", i, p.SData[i]); } for (int i = 0; i < p.IData.Length; i++) { sb.AppendFormat("IntData {0}: {1}\r\n", i, p.IData[i]); } for (int i = 0; i < p.FData.Length; i++) { sb.AppendFormat("FloatData {0}: {1}\r\n", i, p.FData[i]); } Debug.Assert(sb.ToString()); if (p.SData[0] == "shutdown") { Server.Shutdown = true; if (SplashScreen.GetScreen() != null) { SplashScreen.UpdateStatusTextWithStatus(p.SData[1], TypeOfMessage.Error); SplashScreen.GetScreen().Progress.StartColor = Color.FromArgb(210, 202, 0); SplashScreen.GetScreen().Progress.EndColor = Color.FromArgb(210, 202, 0); } else MessageBox.Show(p.SData[1], "Server Shutdown"); MinecraftModUpdater.Logger.Log(Logger.Level.Error, "Server Shutdown. Reason: " + p.SData[1]); } else if (p.SData[0] == "server_name") { Server.Name = p.SData[1]; Server.FontSize = p.FData[0]; Properties.Settings.Default.MinecraftPath = Environment.CurrentDirectory + "/Minecraft/" + ServerFolder; MinecraftModUpdater.Logger.Log(Logger.Level.Info, string.Format("Minecraft path set to: {0}", Properties.Settings.Default.MinecraftPath)); } else if (p.SData[0] == "splash_display") { SplashScreen.UpdateStatusText(p.SData[1]); } else if (p.SData[0] == "require_version") { warnDisconnect = false; SplashScreen.UpdateStatusTextWithStatus("This server requires API version " + p.SData[1] + " for you to connect.", TypeOfMessage.Error); Thread.Sleep(3000); SplashScreen.CloseSplashScreen(); Thread.Sleep(1000); Program.RunOnUIThread(delegate { Close(); }); } else if (p.SData[0] == "version_downgrade") { ClientVersion = p.SData[1]; } }
void ph_FilePart(Packet pa) { FilePartPacket p = pa as FilePartPacket; dlThisSecond += p.Part.Length; progress[1]++; progress[4] += p.Part.Length; if (ExceptionHandler.ProgramCrashed) { ph.Stop(); return; } while (SplashScreen.GetScreen().Loading) ; int i = p.Index; foreach (byte b in p.Part) { CurrentDownload.Contents[i] = b; i++; } }
void ph_AllDone(Packet pa) { AllDonePacket p = pa as AllDonePacket; int i = 0; while (progress[1] != progress[2]) { if (i > 10) { SplashScreen.UpdateStatusText("There was an error while downloading. Retrying..."); Thread.Sleep(5000); Packet.Send(new RequestModPacket { Type = RequestModPacket.RequestType.Download, Identifier = p.Identifier }, ph.Stream); return; } i++; Thread.Sleep(1000); } Mod m = Mods.Find(p.Identifier); string path = Path.GetDirectoryName(Properties.Settings.Default.MinecraftPath + "\\" + m.File); File.WriteAllBytes(path + "\\" + Path.GetFileName(m.File), CurrentDownload.Contents); MinecraftModUpdater.Logger.Log(Logger.Level.Info, "Downloaded " + path + "\\" + Path.GetFileName(m.File)); ProcessStartInfo pr = new ProcessStartInfo("cmd"); pr.CreateNoWindow = true; pr.UseShellExecute = false; pr.RedirectStandardOutput = true; pr.RedirectStandardInput = true; Process proc = new Process(); proc.StartInfo = pr; proc.Start(); foreach (string s in m.PostDownload) { try { proc.StandardInput.WriteLine(s); } catch (Exception e) { ExceptionHandler.HandleException(e, this); } } proc.Kill(); MinecraftModUpdater.Logger.Log(Logger.Level.Info, "[Post Download] " + proc.StandardOutput.ReadToEnd()); if (GetLastModToUpdate().File == m.File) { SplashScreen.UpdateStatusText("All files downloaded!"); Thread.Sleep(1000); warnDisconnect = false; Packet.Send(new LogPacket { LogMessages = MinecraftModUpdater.Logger.GetMessages() }, ph.Stream); Packet.Send(new DisconnectPacket(), ph.Stream); ph.RemovePacketHandler(PacketId.Metadata); ph.RemovePacketHandler(PacketId.ModInfo); ph.RemovePacketHandler(PacketId.ModList); ph.RemovePacketHandler(PacketId.NextDownload); ph.RemovePacketHandler(PacketId.FilePart); ph.RemovePacketHandler(PacketId.AllDone); TaskManager.AddAsyncTask(delegate { ph.Stop(); }, ThreadRole.Delayed, 5000); if (Properties.Settings.Default.LaunchAfterUpdate) { Program.RunOnUIThread(delegate { Program.StartMinecraft(); }); } else { SplashScreen.CloseSplashScreen(); } Program.RunOnUIThread(delegate { Close(); }); return; } progress[0]++; m = (Mod)lsModsToUpdate.Items[progress[0]]; Packet.Send(new RequestModPacket { Type = RequestModPacket.RequestType.Download, Identifier = m.Identifier }, ph.Stream); }
private void HandleFilePart(Packet pa) { FilePartPacket p = pa as FilePartPacket; int i = p.Index; foreach (byte b in p.Part) { mods[currentDownload].Contents[i] = b; i++; } downloaded += p.Part.Length; }
/// <summary> /// Reads the next packet in the stream. /// </summary> /// <param name="Stream">The stream to read from</param> /// <returns>A fully read packet.</returns> public static Packet ReadPacket(ModUpdaterNetworkStream Stream) { Type Packet = null; Packet p = null; if (Stream.Disposed) return null; try { PacketId id = PacketId.Disconnect; try { id = (PacketId)Stream.ReadNetworkByte(); } catch (MalformedPacketException) { return null; } if (!Map.ContainsValue(id)) { Stream.Flush(); return null; } MinecraftModUpdater.Logger.Log(Logger.Level.Debug, string.Format("Read packet {0}", id.ToString())); foreach (var v in Map) { if (v.Value == id) { Packet = v.Key; } } p = (Packet)Packet.GetConstructor(new Type[] { }).Invoke(null); p.Timestamp = new UnixTime(Stream.ReadLong()).ToDateTime(); p.Read(Stream); lastRecived = p; } catch (MalformedPacketException e) { throw new MalformedPacketException(e.Message, e); } catch (Exception e) { MCModUpdaterExceptionHandler.HandleException(p, e); } return p; }
void ph_ModList(Packet pa) { ModListPacket p = pa as ModListPacket; identifiers.AddRange(p.Mods); if (p.Mods.Length == 0) { Program.RunOnUIThread(delegate { SplashScreen.CloseSplashScreen(); Show(); }); return; } Program.RunOnUIThread(delegate { if (Visible) Hide(); }); foreach (string s in p.Mods) { Packet.Send(new RequestModPacket { Identifier = s, Type = RequestModPacket.RequestType.Info }, ph.Stream); } bool exists = Directory.Exists(Properties.Settings.Default.MinecraftPath + @"\mods"); if (!exists) Directory.CreateDirectory(Properties.Settings.Default.MinecraftPath + @"\mods"); SplashScreen.AdvanceProgressBar(); }
/// <summary> /// Sends a packet. /// </summary> /// <param name="p">The packet to send</param> /// <param name="Stream">The stream to send it on.</param> public static void Send(Packet p, ModUpdaterNetworkStream Stream) { if (Stream.Disposed) return; while (busy) ; busy = true; try { PacketId id = GetPacketId(p); Stream.WriteNetworkByte((byte)id); //Write timestamp Stream.WriteLong(new UnixTime().Value); //Write packet. p.Write(Stream); lastSent = p; MinecraftModUpdater.Logger.Log(Logger.Level.Debug, string.Format("Sent packet {0}", id.ToString())); } catch (Exception e) { MinecraftModUpdater.Logger.Log(e); MinecraftModUpdater.Logger.Log(e); } busy = false; }
private void HandleAllDone(Packet pa) { AllDonePacket p = pa as AllDonePacket; Mod m = mods.Find(new Predicate<Mod>(delegate(Mod mod) { return mod.Identifier == p.Identifier; })); if (!Directory.Exists(Path.GetDirectoryName(InstancePath + m.File))) Directory.CreateDirectory(Path.GetDirectoryName(InstancePath + m.File)); File.WriteAllBytes(InstancePath + m.File, mods[currentDownload].Contents); updated++; if (updated == amountOfUpdates) { Thread.Sleep(3000); Invoke(new VoidInvoke(delegate { listBox1.Enabled = true; })); } }