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