mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	Many IDisposable fixes. GlobalNadeko won't have file watchers for creds. Wallet simplified
This commit is contained in:
		@@ -1,87 +1,87 @@
 | 
			
		||||
// Copyright (c) .NET Foundation. All rights reserved.
 | 
			
		||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 | 
			
		||||
// https://github.com/aspnet/Common/blob/dev/shared/Microsoft.Extensions.Process.Sources/ProcessHelper.cs
 | 
			
		||||
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Extensions;
 | 
			
		||||
 | 
			
		||||
public static class ProcessExtensions
 | 
			
		||||
{
 | 
			
		||||
    private static readonly bool _isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
 | 
			
		||||
    private static readonly TimeSpan _defaultTimeout = TimeSpan.FromSeconds(10);
 | 
			
		||||
 | 
			
		||||
    public static void KillTree(this Process process)
 | 
			
		||||
        => process.KillTree(_defaultTimeout);
 | 
			
		||||
 | 
			
		||||
    public static void KillTree(this Process process, TimeSpan timeout)
 | 
			
		||||
    {
 | 
			
		||||
        if (_isWindows)
 | 
			
		||||
            RunProcessAndWaitForExit("taskkill", $"/T /F /PID {process.Id}", timeout, out _);
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            var children = new HashSet<int>();
 | 
			
		||||
            GetAllChildIdsUnix(process.Id, children, timeout);
 | 
			
		||||
            foreach (var childId in children)
 | 
			
		||||
                KillProcessUnix(childId, timeout);
 | 
			
		||||
 | 
			
		||||
            KillProcessUnix(process.Id, timeout);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void GetAllChildIdsUnix(int parentId, ISet<int> children, TimeSpan timeout)
 | 
			
		||||
    {
 | 
			
		||||
        var exitCode = RunProcessAndWaitForExit("pgrep", $"-P {parentId}", timeout, out var stdout);
 | 
			
		||||
 | 
			
		||||
        if (exitCode == 0 && !string.IsNullOrEmpty(stdout))
 | 
			
		||||
        {
 | 
			
		||||
            using var reader = new StringReader(stdout);
 | 
			
		||||
            while (true)
 | 
			
		||||
            {
 | 
			
		||||
                var text = reader.ReadLine();
 | 
			
		||||
                if (text is null)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                if (int.TryParse(text, out var id))
 | 
			
		||||
                {
 | 
			
		||||
                    children.Add(id);
 | 
			
		||||
                    // Recursively get the children
 | 
			
		||||
                    GetAllChildIdsUnix(id, children, timeout);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void KillProcessUnix(int processId, TimeSpan timeout)
 | 
			
		||||
        => RunProcessAndWaitForExit("kill", $"-TERM {processId}", timeout, out _);
 | 
			
		||||
 | 
			
		||||
    private static int RunProcessAndWaitForExit(
 | 
			
		||||
        string fileName,
 | 
			
		||||
        string arguments,
 | 
			
		||||
        TimeSpan timeout,
 | 
			
		||||
        out string? stdout)
 | 
			
		||||
    {
 | 
			
		||||
        stdout = null;
 | 
			
		||||
 | 
			
		||||
        var startInfo = new ProcessStartInfo
 | 
			
		||||
        {
 | 
			
		||||
            FileName = fileName,
 | 
			
		||||
            Arguments = arguments,
 | 
			
		||||
            RedirectStandardOutput = true,
 | 
			
		||||
            UseShellExecute = false
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        var process = Process.Start(startInfo);
 | 
			
		||||
 | 
			
		||||
        if (process is null)
 | 
			
		||||
            return -1;
 | 
			
		||||
 | 
			
		||||
        if (process.WaitForExit((int)timeout.TotalMilliseconds))
 | 
			
		||||
            stdout = process.StandardOutput.ReadToEnd();
 | 
			
		||||
        else
 | 
			
		||||
            process.Kill();
 | 
			
		||||
 | 
			
		||||
        return process.ExitCode;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
// // Copyright (c) .NET Foundation. All rights reserved.
 | 
			
		||||
// // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 | 
			
		||||
// // https://github.com/aspnet/Common/blob/dev/shared/Microsoft.Extensions.Process.Sources/ProcessHelper.cs
 | 
			
		||||
//
 | 
			
		||||
// using System.Diagnostics;
 | 
			
		||||
// using System.Runtime.InteropServices;
 | 
			
		||||
//
 | 
			
		||||
// namespace NadekoBot.Extensions;
 | 
			
		||||
//
 | 
			
		||||
// public static class ProcessExtensions
 | 
			
		||||
// {
 | 
			
		||||
//     private static readonly bool _isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
 | 
			
		||||
//     private static readonly TimeSpan _defaultTimeout = TimeSpan.FromSeconds(10);
 | 
			
		||||
//
 | 
			
		||||
//     public static void KillTree(this Process process)
 | 
			
		||||
//         => process.KillTree(_defaultTimeout);
 | 
			
		||||
//
 | 
			
		||||
//     public static void KillTree(this Process process, TimeSpan timeout)
 | 
			
		||||
//     {
 | 
			
		||||
//         if (_isWindows)
 | 
			
		||||
//             RunProcessAndWaitForExit("taskkill", $"/T /F /PID {process.Id}", timeout, out _);
 | 
			
		||||
//         else
 | 
			
		||||
//         {
 | 
			
		||||
//             var children = new HashSet<int>();
 | 
			
		||||
//             GetAllChildIdsUnix(process.Id, children, timeout);
 | 
			
		||||
//             foreach (var childId in children)
 | 
			
		||||
//                 KillProcessUnix(childId, timeout);
 | 
			
		||||
//
 | 
			
		||||
//             KillProcessUnix(process.Id, timeout);
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//     private static void GetAllChildIdsUnix(int parentId, ISet<int> children, TimeSpan timeout)
 | 
			
		||||
//     {
 | 
			
		||||
//         var exitCode = RunProcessAndWaitForExit("pgrep", $"-P {parentId}", timeout, out var stdout);
 | 
			
		||||
//
 | 
			
		||||
//         if (exitCode == 0 && !string.IsNullOrEmpty(stdout))
 | 
			
		||||
//         {
 | 
			
		||||
//             using var reader = new StringReader(stdout);
 | 
			
		||||
//             while (true)
 | 
			
		||||
//             {
 | 
			
		||||
//                 var text = reader.ReadLine();
 | 
			
		||||
//                 if (text is null)
 | 
			
		||||
//                     return;
 | 
			
		||||
//
 | 
			
		||||
//                 if (int.TryParse(text, out var id))
 | 
			
		||||
//                 {
 | 
			
		||||
//                     children.Add(id);
 | 
			
		||||
//                     // Recursively get the children
 | 
			
		||||
//                     GetAllChildIdsUnix(id, children, timeout);
 | 
			
		||||
//                 }
 | 
			
		||||
//             }
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//     private static void KillProcessUnix(int processId, TimeSpan timeout)
 | 
			
		||||
//         => RunProcessAndWaitForExit("kill", $"-TERM {processId}", timeout, out _);
 | 
			
		||||
//
 | 
			
		||||
//     private static int RunProcessAndWaitForExit(
 | 
			
		||||
//         string fileName,
 | 
			
		||||
//         string arguments,
 | 
			
		||||
//         TimeSpan timeout,
 | 
			
		||||
//         out string? stdout)
 | 
			
		||||
//     {
 | 
			
		||||
//         stdout = null;
 | 
			
		||||
//
 | 
			
		||||
//         var startInfo = new ProcessStartInfo
 | 
			
		||||
//         {
 | 
			
		||||
//             FileName = fileName,
 | 
			
		||||
//             Arguments = arguments,
 | 
			
		||||
//             RedirectStandardOutput = true,
 | 
			
		||||
//             UseShellExecute = false
 | 
			
		||||
//         };
 | 
			
		||||
//
 | 
			
		||||
//         using var process = Process.Start(startInfo);
 | 
			
		||||
//
 | 
			
		||||
//         if (process is null)
 | 
			
		||||
//             return -1;
 | 
			
		||||
//
 | 
			
		||||
//         if (process.WaitForExit((int)timeout.TotalMilliseconds))
 | 
			
		||||
//             stdout = process.StandardOutput.ReadToEnd();
 | 
			
		||||
//         else
 | 
			
		||||
//             process.Kill();
 | 
			
		||||
//
 | 
			
		||||
//         return process.ExitCode;
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
@@ -21,7 +21,7 @@ public static class Rgba32Extensions
 | 
			
		||||
            var xOffset = 0;
 | 
			
		||||
            for (var i = 0; i < imgArray.Count; i++)
 | 
			
		||||
            {
 | 
			
		||||
                var frame = imgArray[i].Frames.CloneFrame(frameNumber % imgArray[i].Frames.Count);
 | 
			
		||||
                using var frame = imgArray[i].Frames.CloneFrame(frameNumber % imgArray[i].Frames.Count);
 | 
			
		||||
                var offset = xOffset;
 | 
			
		||||
                imgFrame.Mutate(x => x.DrawImage(frame, new(offset, 0), new GraphicsOptions()));
 | 
			
		||||
                xOffset += imgArray[i].Bounds().Width;
 | 
			
		||||
 
 | 
			
		||||
@@ -89,7 +89,7 @@ public static class StringExtensions
 | 
			
		||||
    public static async Task<Stream> ToStream(this string str)
 | 
			
		||||
    {
 | 
			
		||||
        var ms = new MemoryStream();
 | 
			
		||||
        var sw = new StreamWriter(ms);
 | 
			
		||||
        await using var sw = new StreamWriter(ms);
 | 
			
		||||
        await sw.WriteAsync(str);
 | 
			
		||||
        await sw.FlushAsync();
 | 
			
		||||
        ms.Position = 0;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user