mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Merge remote-tracking branch 'origin/main' into blazor
This commit is contained in:
commit
3352657911
@ -23,14 +23,6 @@ public class CommandLineBuilder
|
||||
foreach (var verb in _verbs)
|
||||
root.Add(verb.MakeCommand());
|
||||
|
||||
/*
|
||||
foreach (var verb in _verbs)
|
||||
root.AddCommand(verb.MakeCommand());
|
||||
var builder = new System.CommandLine.Builder.CommandLineBuilder(root);
|
||||
var built = builder.Build();
|
||||
var parsed = built.Parse(args);
|
||||
return await parsed.InvokeAsync(_console);*/
|
||||
|
||||
return await root.InvokeAsync(args);
|
||||
}
|
||||
}
|
@ -18,6 +18,8 @@ public class AppSettings
|
||||
public string SpamWebHook { get; set; } = null;
|
||||
public string HamWebHook { get; set; } = null;
|
||||
|
||||
public string DiscordKey { get; set; }
|
||||
|
||||
public string AuthoredFilesFolder { get; set; }
|
||||
|
||||
public string PatchesFilesFolder { get; set; }
|
||||
|
@ -1,73 +1,76 @@
|
||||
using System;
|
||||
using Newtonsoft.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace Wabbajack.Server.DTOs;
|
||||
|
||||
public class DiscordMessage
|
||||
{
|
||||
[JsonProperty("username")] public string UserName { get; set; }
|
||||
[JsonPropertyName("username")]
|
||||
public string? UserName { get; set; }
|
||||
|
||||
[JsonProperty("avatar_url")] public Uri AvatarUrl { get; set; }
|
||||
[JsonPropertyName("avatar_url")]
|
||||
public Uri? AvatarUrl { get; set; }
|
||||
|
||||
[JsonProperty("content")] public string Content { get; set; }
|
||||
[JsonPropertyName("content")]
|
||||
public string? Content { get; set; }
|
||||
|
||||
[JsonProperty("embeds")] public DiscordEmbed[] Embeds { get; set; }
|
||||
[JsonPropertyName("embeds")]
|
||||
public DiscordEmbed[]? Embeds { get; set; }
|
||||
}
|
||||
|
||||
public class DiscordEmbed
|
||||
{
|
||||
[JsonProperty("title")] public string Title { get; set; }
|
||||
[JsonPropertyName("title")] public string Title { get; set; }
|
||||
|
||||
[JsonProperty("color")] public int Color { get; set; }
|
||||
[JsonPropertyName("color")] public int Color { get; set; }
|
||||
|
||||
[JsonProperty("author")] public DiscordAuthor Author { get; set; }
|
||||
[JsonPropertyName("author")] public DiscordAuthor Author { get; set; }
|
||||
|
||||
[JsonProperty("url")] public Uri Url { get; set; }
|
||||
[JsonPropertyName("url")] public Uri Url { get; set; }
|
||||
|
||||
[JsonProperty("description")] public string Description { get; set; }
|
||||
[JsonPropertyName("description")] public string Description { get; set; }
|
||||
|
||||
[JsonProperty("fields")] public DiscordField Field { get; set; }
|
||||
[JsonPropertyName("fields")] public DiscordField Field { get; set; }
|
||||
|
||||
[JsonProperty("thumbnail")] public DiscordNumbnail Thumbnail { get; set; }
|
||||
[JsonPropertyName("thumbnail")] public DiscordThumbnail Thumbnail { get; set; }
|
||||
|
||||
[JsonProperty("image")] public DiscordImage Image { get; set; }
|
||||
[JsonPropertyName("image")] public DiscordImage Image { get; set; }
|
||||
|
||||
[JsonProperty("footer")] public DiscordFooter Footer { get; set; }
|
||||
[JsonPropertyName("footer")] public DiscordFooter Footer { get; set; }
|
||||
|
||||
[JsonProperty("timestamp")] public DateTime Timestamp { get; set; } = DateTime.UtcNow;
|
||||
[JsonPropertyName("timestamp")] public DateTime Timestamp { get; set; } = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public class DiscordAuthor
|
||||
{
|
||||
[JsonProperty("name")] public string Name { get; set; }
|
||||
[JsonPropertyName("name")] public string Name { get; set; }
|
||||
|
||||
[JsonProperty("url")] public Uri Url { get; set; }
|
||||
[JsonPropertyName("url")] public Uri Url { get; set; }
|
||||
|
||||
[JsonProperty("icon_url")] public Uri IconUrl { get; set; }
|
||||
[JsonPropertyName("icon_url")] public Uri IconUrl { get; set; }
|
||||
}
|
||||
|
||||
public class DiscordField
|
||||
{
|
||||
[JsonProperty("name")] public string Name { get; set; }
|
||||
[JsonPropertyName("name")] public string Name { get; set; }
|
||||
|
||||
[JsonProperty("value")] public string Value { get; set; }
|
||||
[JsonPropertyName("value")] public string Value { get; set; }
|
||||
|
||||
[JsonProperty("inline")] public bool Inline { get; set; }
|
||||
[JsonPropertyName("inline")] public bool Inline { get; set; }
|
||||
}
|
||||
|
||||
public class DiscordNumbnail
|
||||
public class DiscordThumbnail
|
||||
{
|
||||
[JsonProperty("Url")] public Uri Url { get; set; }
|
||||
[JsonPropertyName("Url")] public Uri Url { get; set; }
|
||||
}
|
||||
|
||||
public class DiscordImage
|
||||
{
|
||||
[JsonProperty("Url")] public Uri Url { get; set; }
|
||||
[JsonPropertyName("Url")] public Uri Url { get; set; }
|
||||
}
|
||||
|
||||
public class DiscordFooter
|
||||
{
|
||||
[JsonProperty("text")] public string Text { get; set; }
|
||||
[JsonPropertyName("text")] public string Text { get; set; }
|
||||
|
||||
[JsonProperty("icon_url")] public Uri icon_url { get; set; }
|
||||
[JsonPropertyName("icon_url")] public Uri icon_url { get; set; }
|
||||
}
|
104
Wabbajack.Server/Services/DiscordBackend.cs
Normal file
104
Wabbajack.Server/Services/DiscordBackend.cs
Normal file
@ -0,0 +1,104 @@
|
||||
using Discord;
|
||||
using Discord.WebSocket;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Wabbajack.BuildServer;
|
||||
|
||||
namespace Wabbajack.Server.Services;
|
||||
|
||||
public class DiscordBackend
|
||||
{
|
||||
private readonly AppSettings _settings;
|
||||
private readonly ILogger<DiscordBackend> _logger;
|
||||
private readonly DiscordSocketClient _client;
|
||||
private readonly NexusCacheManager _nexusCacheManager;
|
||||
|
||||
public DiscordBackend(ILogger<DiscordBackend> logger, AppSettings settings, NexusCacheManager nexusCacheManager)
|
||||
{
|
||||
_settings = settings;
|
||||
_logger = logger;
|
||||
_nexusCacheManager = nexusCacheManager;
|
||||
_client = new DiscordSocketClient(new DiscordSocketConfig()
|
||||
{
|
||||
|
||||
});
|
||||
_client.Log += LogAsync;
|
||||
_client.Ready += ReadyAsync;
|
||||
_client.MessageReceived += MessageReceivedAsync;
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await _client.LoginAsync(TokenType.Bot, settings.DiscordKey);
|
||||
await _client.StartAsync();
|
||||
});
|
||||
}
|
||||
|
||||
private async Task MessageReceivedAsync(SocketMessage arg)
|
||||
{
|
||||
_logger.LogInformation(arg.Content);
|
||||
|
||||
if (arg.Content.StartsWith("!dervenin"))
|
||||
{
|
||||
var parts = arg.Content.Split(" ", StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts[0] != "!dervenin")
|
||||
return;
|
||||
|
||||
if (parts.Length == 1)
|
||||
{
|
||||
await ReplyTo(arg, "Wat?");
|
||||
}
|
||||
|
||||
if (parts[1] == "purge-nexus-cache")
|
||||
{
|
||||
if (parts.Length != 3)
|
||||
{
|
||||
await ReplyTo(arg, "Welp you did that wrong, gotta give me a mod-id or url");
|
||||
return;
|
||||
}
|
||||
var rows = await _nexusCacheManager.Purge(parts[2]);
|
||||
await ReplyTo(arg, $"Purged {rows} rows");
|
||||
}
|
||||
|
||||
if (parts[1] == "nft")
|
||||
{
|
||||
await ReplyTo(arg, "No Fucking Thanks.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ReplyTo(SocketMessage socketMessage, string message)
|
||||
{
|
||||
await socketMessage.Channel.SendMessageAsync(message);
|
||||
}
|
||||
|
||||
|
||||
private async Task ReadyAsync()
|
||||
{
|
||||
}
|
||||
|
||||
private async Task LogAsync(LogMessage arg)
|
||||
{
|
||||
switch (arg.Severity)
|
||||
{
|
||||
case LogSeverity.Info:
|
||||
_logger.LogInformation(arg.Message);
|
||||
break;
|
||||
case LogSeverity.Warning:
|
||||
_logger.LogWarning(arg.Message);
|
||||
break;
|
||||
case LogSeverity.Critical:
|
||||
_logger.LogCritical(arg.Message);
|
||||
break;
|
||||
case LogSeverity.Error:
|
||||
_logger.LogError(arg.Exception, arg.Message);
|
||||
break;
|
||||
case LogSeverity.Verbose:
|
||||
_logger.LogTrace(arg.Message);
|
||||
break;
|
||||
case LogSeverity.Debug:
|
||||
_logger.LogDebug(arg.Message);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
@ -34,12 +34,16 @@ public class DiscordWebHook : AbstractService<DiscordWebHook, int>
|
||||
_client = client;
|
||||
_dtos = dtos;
|
||||
|
||||
var message = new DiscordMessage
|
||||
Task.Run(async () =>
|
||||
{
|
||||
Content = $"\"{GetQuote()}\" - Sheogorath (as he brings the server online)"
|
||||
};
|
||||
var a = Send(Channel.Ham, message);
|
||||
var b = Send(Channel.Spam, message);
|
||||
|
||||
var message = new DiscordMessage
|
||||
{
|
||||
Content = $"\"{await GetQuote()}\" - Sheogorath (as he brings the server online)"
|
||||
};
|
||||
await Send(Channel.Ham, message);
|
||||
await Send(Channel.Spam, message);
|
||||
});
|
||||
}
|
||||
|
||||
public async Task Send(Channel channel, DiscordMessage message)
|
||||
|
@ -145,4 +145,25 @@ public class NexusCacheManager
|
||||
_lockObject.Release();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<int> Purge(string mod)
|
||||
{
|
||||
if (Uri.TryCreate(mod, UriKind.Absolute, out var url))
|
||||
{
|
||||
mod = Enumerable.Last(url.AbsolutePath.Split("/", StringSplitOptions.RemoveEmptyEntries));
|
||||
}
|
||||
|
||||
var count = 0;
|
||||
if (!int.TryParse(mod, out var mod_id)) return count;
|
||||
|
||||
foreach (var file in _cacheFolder.EnumerateFiles())
|
||||
{
|
||||
if (!file.FileName.ToString().Contains($"_{mod_id}")) continue;
|
||||
|
||||
await PurgeCacheEntry(file);
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Wabbajack.BuildServer;
|
||||
using Wabbajack.Server.DTOs;
|
||||
|
||||
namespace Wabbajack.Server.Services;
|
||||
|
||||
public class Watchdog : AbstractService<Watchdog, int>
|
||||
{
|
||||
private readonly DiscordWebHook _discord;
|
||||
|
||||
public Watchdog(ILogger<Watchdog> logger, AppSettings settings, QuickSync quickSync, DiscordWebHook discordWebHook)
|
||||
: base(logger, settings, quickSync, TimeSpan.FromMinutes(5))
|
||||
{
|
||||
_discord = discordWebHook;
|
||||
}
|
||||
|
||||
public override async Task<int> Execute()
|
||||
{
|
||||
var report = await _quickSync.Report();
|
||||
foreach (var service in report)
|
||||
if (service.Value.LastRunTime != default && service.Value.LastRunTime >= service.Value.Delay * 4)
|
||||
await _discord.Send(Channel.Spam,
|
||||
new DiscordMessage
|
||||
{
|
||||
Content =
|
||||
$"Service {service.Key.Name} has missed it's scheduled execution window. \n Current work: \n {string.Join("\n", service.Value.ActiveWork)}"
|
||||
});
|
||||
|
||||
return report.Count;
|
||||
}
|
||||
}
|
@ -68,7 +68,6 @@ public class Startup
|
||||
services.AddSingleton<QuickSync>();
|
||||
services.AddSingleton<GlobalInformation>();
|
||||
services.AddSingleton<DiscordWebHook>();
|
||||
services.AddSingleton<Watchdog>();
|
||||
services.AddSingleton<Metrics>();
|
||||
services.AddSingleton<HttpClient>();
|
||||
services.AddSingleton<AuthorFiles>();
|
||||
@ -76,6 +75,7 @@ public class Startup
|
||||
services.AddSingleton<Client>();
|
||||
services.AddSingleton<NexusCacheManager>();
|
||||
services.AddSingleton<NexusApi>();
|
||||
services.AddSingleton<DiscordBackend>();
|
||||
services.AddAllSingleton<ITokenProvider<NexusApiState>, NexusApiTokenProvider>();
|
||||
services.AddAllSingleton<IResource, IResource<HttpClient>>(s => new Resource<HttpClient>("Web Requests", 12));
|
||||
// Application Info
|
||||
@ -142,7 +142,6 @@ public class Startup
|
||||
app.UseResponseCompression();
|
||||
|
||||
app.UseService<DiscordWebHook>();
|
||||
app.UseService<Watchdog>();
|
||||
|
||||
app.UseResponseCaching();
|
||||
|
||||
@ -178,6 +177,7 @@ public class Startup
|
||||
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
|
||||
|
||||
// Trigger the internal update code
|
||||
var _ = app.ApplicationServices.GetRequiredService<NexusCacheManager>();
|
||||
app.ApplicationServices.GetRequiredService<NexusCacheManager>();
|
||||
app.ApplicationServices.GetRequiredService<DiscordBackend>();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user