diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index db5e6fb8..fefa6400 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -68,14 +68,30 @@ jobs: env: DOTNET_NOLOGO: true - - name: Target Publish Executable - uses: tix-factory/release-manager@v1 + - name: Rename Binary + run: | + mv ${{ env.built-executable-path }} ${{ env.PROJECT }}-${{ env.build-version-info }}-${{ matrix.target }}${{ (startsWith(matrix.target, 'win') && '.exe') || ' ' }} + + - name: Wait + # We wait before creating a release because we might run into a race condition + # while creating a new tag (as opposed to using the existing tag, if any) since we're running builds in parallel. + run: | + sleep 5s + + - name: Create Release + uses: ncipollo/release-action@v1.14.0 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - mode: uploadReleaseAsset - filePath: ${{ env.built-executable-path }} - assetName: ${{ env.PROJECT }}-${{ env.build-version-info }}-${{ matrix.target }}${{ (startsWith(matrix.target, 'win') && '.exe') || ' ' }} + token: ${{ secrets.GITHUB_TOKEN }} + artifacts: ${{ env.PROJECT }}-${{ env.build-version-info }}-${{ matrix.target }}${{ (startsWith(matrix.target, 'win') && '.exe') || ' ' }} tag: ${{ format('{0}-{1}', env.date, github.run_number) }} + name: '${{ env.build-version-info }}: ${{ github.event.head_commit.message }}' + generateReleaseNotes: true + artifactErrorsFailBuild: true + allowUpdates: true + makeLatest: true + omitBodyDuringUpdate: true + omitNameDuringUpdate: true + replacesArtifacts: false fetch-translations: strategy: @@ -127,86 +143,6 @@ jobs: with: path: ${{ github.workspace }}/* key: "translation-${{ github.sha }}" - - build-transition-version: - runs-on: ubuntu-latest - if: ${{ always() && needs.fetch-translations.result != 'failure' }} - needs: [determine-build, fetch-translations] - timeout-minutes: 15 - strategy: - fail-fast: true - matrix: - target: [win-x86, win-x64, linux-x64, linux-arm64, osx-x64] - - steps: - - name: Checkout - uses: actions/checkout@v3 - if: ${{ always() && needs.fetch-translations.result == 'skipped' }} - with: - fetch-depth: 0 - submodules: 'true' - - - name: Get Current Date - run: | - echo date=$(date +'%Y%m%d') >> $GITHUB_ENV - echo date_dashed=$(date -u +'%Y-%m-%d') >> $GITHUB_ENV - - - name: Restore Translations (if available) - uses: actions/cache/restore@v3 - with: - path: ${{ github.workspace }}/* - key: "translation-${{ github.sha }}" - restore-keys: "translation-" - - - name: Setup Environment Variables (early) - run: | - echo project-path=${{ github.workspace }}/${{ env.PROJECT }} >> $GITHUB_ENV - echo file-ext=${{ (startsWith(matrix.target, 'win') && '.exe') || ' ' }} >> $GITHUB_ENV - - - name: Setup Environment Variables - run: | - echo target-out-path=${{ env.project-path }}/bin/Release/${{ env.target-version }}/${{ matrix.target }}/publish/ >> $GITHUB_ENV - echo assembly-info=${{ env.project-path }}/Properties/AssemblyInfo.cs >> $GITHUB_ENV - echo build-version-info=${{ env.date_dashed }}-${{ github.run_number }} >> $GITHUB_ENV - echo commit=$(echo ${{ github.sha }} | cut -c 1-7) >> $GITHUB_ENV - - - name: Setup Environment Variables (late) - run: | - echo built-executable-path=${{ env.target-out-path }}${{ env.PROJECT }}${{ env.file-ext }} >> $GITHUB_ENV - - - name: Set Version Info - run: | - echo '' >> ${{ env.assembly-info }} - echo "[assembly: AssemblyConfiguration(\"GitHub build ${{ github.run_number }}, built on ${{ env.date_dashed }} from commit ${{ env.commit }}\")]" >> ${{ env.assembly-info }} - sed -i -e 's|SentryDSN = "";|SentryDSN = "${{ secrets.SENTRY_DSN }}";|g' ${{ env.project-path }}/Program.cs - - - name: Build Target - run: dotnet publish ${{ env.project-path }}.sln -f ${{ env.target-version }} -r ${{ matrix.target }} ${{ env.compile-flags }} - env: - DOTNET_NOLOGO: true - - - name: Zip Target - run: zip -qq -r mcc-${{ matrix.target }}.zip * - working-directory: ${{ env.target-out-path }} - - - name: Target Publish Executable - uses: tix-factory/release-manager@v1 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - mode: uploadReleaseAsset - filePath: ${{ env.target-out-path }}/mcc-${{ matrix.target }}.zip - assetName: ${{ env.PROJECT }}-${{ (contains(matrix.target, 'linux-x64') && 'linux.zip') || (contains(matrix.target, 'win-x86') && 'windows-x86.zip') || (contains(matrix.target, 'win-x64') && 'windows-x64.zip') || (contains(matrix.target, 'linux-arm64') && 'linux-arm64.zip') || (contains(matrix.target, 'osx-x64') && 'osx.zip') }} - tag: ${{ format('{0}-{1}', env.date, github.run_number) }} - - - name: Sentry Release - uses: getsentry/action-release@v1.7.0 - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - with: - environment: production - dist: ${{ format('{0}-{1}', env.date, github.run_number) }} determine-build: runs-on: ubuntu-latest diff --git a/Docker/start-latest.sh b/Docker/start-latest.sh index d94d8f00..01cc5847 100644 --- a/Docker/start-latest.sh +++ b/Docker/start-latest.sh @@ -10,20 +10,16 @@ else # Use the provided version tag or get the latest release tag RELEASE_TAG=${MCC_VERSION:-$(curl -s -v https://github.com/MCCTeam/Minecraft-Console-Client/releases/latest 2>&1 | grep -i location: | tr -d '\r' | cut -d/ -f8)} + # Taken from https://stackoverflow.com/a/70369688 + ARCH=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/x64/) + # Delete the old build - [ -e MinecraftClient-linux.zip ] && rm -- MinecraftClient-linux.zip [ -e MinecraftClient ] && rm -- MinecraftClient - echo "Donwloading MinecraftClient for ${RELEASE_TAG}" + echo "Donwloading MinecraftClient for ${RELEASE_TAG}-${ARCH}" # Download the specified build or the latest one - curl -L https://github.com/MCCTeam/Minecraft-Console-Client/releases/download/${RELEASE_TAG}/MinecraftClient-${MCC_PLATFORM:=linux}.zip --output MinecraftClient-linux.zip - - # Unzip it - unzip MinecraftClient-linux.zip - - # Remove the ZIP - rm -- MinecraftClient-linux.zip + curl -L https://github.com/MCCTeam/Minecraft-Console-Client/releases/download/${RELEASE_TAG}/MinecraftClient-${RELEASE_TAG}-${MCC_PLATFORM:=linux}-${ARCH} --output MinecraftClient fi # Set Executable diff --git a/MinecraftClient/ChatBots/AutoDig.cs b/MinecraftClient/ChatBots/AutoDig.cs index cddb6ffd..17c27895 100644 --- a/MinecraftClient/ChatBots/AutoDig.cs +++ b/MinecraftClient/ChatBots/AutoDig.cs @@ -285,7 +285,7 @@ namespace MinecraftClient.ChatBots if (Config.Mode == Configs.ModeType.lookat || (Config.Mode == Configs.ModeType.both && Config._Locations.Contains(blockLoc))) { - if (DigBlock(blockLoc, lookAtBlock: false)) + if (DigBlock(blockLoc, Direction.Down, lookAtBlock: false)) { currentDig = blockLoc; if (Config.Log_Block_Dig) @@ -346,7 +346,7 @@ namespace MinecraftClient.ChatBots if (minDistance <= 6.0) { - if (DigBlock(target, lookAtBlock: true)) + if (DigBlock(target, Direction.Down, lookAtBlock: true)) { currentDig = target; if (Config.Log_Block_Dig) @@ -380,7 +380,7 @@ namespace MinecraftClient.ChatBots ((Config.List_Type == Configs.ListType.whitelist && Config.Blocks.Contains(block.Type)) || (Config.List_Type == Configs.ListType.blacklist && !Config.Blocks.Contains(block.Type)))) { - if (DigBlock(blockLoc, lookAtBlock: true)) + if (DigBlock(blockLoc, Direction.Down, lookAtBlock: true)) { currentDig = blockLoc; if (Config.Log_Block_Dig) diff --git a/MinecraftClient/ChatBots/Farmer.cs b/MinecraftClient/ChatBots/Farmer.cs index f072ba2e..7c15791c 100644 --- a/MinecraftClient/ChatBots/Farmer.cs +++ b/MinecraftClient/ChatBots/Farmer.cs @@ -831,7 +831,7 @@ namespace MinecraftClient.ChatBots // Yoinked from Daenges's Sugarcane Farmer private bool WaitForDigBlock(Location block, int digTimeout = 1000) { - if (!DigBlock(block.ToFloor())) return false; + if (!DigBlock(block.ToFloor(), Direction.Down)) return false; short i = 0; // Maximum wait time of 10 sec. while (GetWorld().GetBlock(block).Type != Material.Air && i <= digTimeout) { diff --git a/MinecraftClient/ChatBots/WebSocketBot.cs b/MinecraftClient/ChatBots/WebSocketBot.cs deleted file mode 100644 index c57f8605..00000000 --- a/MinecraftClient/ChatBots/WebSocketBot.cs +++ /dev/null @@ -1,1349 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Net.WebSockets; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using MinecraftClient.CommandHandler; -using MinecraftClient.Inventory; -using MinecraftClient.Mapping; -using MinecraftClient.Scripting; -using Newtonsoft.Json; -using Tomlet.Attributes; - -namespace MinecraftClient.ChatBots; - -internal class SessionEventArgs : EventArgs -{ - public string SessionId { get; } - - public SessionEventArgs(string sessionId) - { - SessionId = sessionId; - } -} - -internal class MessageReceivedEventArgs : EventArgs -{ - public string SessionId { get; } - public string Message { get; } - - public MessageReceivedEventArgs(string sessionId, string message) - { - SessionId = sessionId; - Message = message; - } -} - -internal class WebSocketSession -{ - public string SessionId { get; set; } - public WebSocket WebSocket { get; set; } - - public WebSocketSession(string sessionId, WebSocket webSocket) - { - SessionId = sessionId; - WebSocket = webSocket; - } -} - -internal class WebSocketServer -{ - public readonly ConcurrentDictionary Sessions; - public event EventHandler? NewSession; - public event EventHandler? SessionDropped; - public event EventHandler? MessageReceived; - - private HttpListener? listener; - - public WebSocketServer() - { - Sessions = new ConcurrentDictionary(); - } - - public async Task Start(string ipAddress, int port) - { - listener = new HttpListener(); - listener.Prefixes.Add($"http://{ipAddress}:{port}/"); - listener.Start(); - - while (listener.IsListening) - { - var context = await listener.GetContextAsync(); - if (context.Request.IsWebSocketRequest) - { - var sessionGuid = Guid.NewGuid().ToString(); - var webSocketContext = await context.AcceptWebSocketAsync(null); - var webSocket = webSocketContext.WebSocket; - var webSocketSession = new WebSocketSession(sessionGuid, webSocket); - - NewSession?.Invoke(this, new SessionEventArgs(sessionGuid)); - Sessions.TryAdd(sessionGuid, webSocketSession); - _ = ProcessWebSocketSession(webSocketSession); - } - else - { - context.Response.StatusCode = 400; - context.Response.Close(); - } - } - } - - public async Task Stop() - { - foreach (var session in Sessions) - { - await session.Value.WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Server shutting down", - CancellationToken.None); - } - - Sessions.Clear(); - listener?.Stop(); - } - - private async Task ProcessWebSocketSession(WebSocketSession webSocketSession) - { - var buffer = new byte[1024]; - - try - { - while (webSocketSession.WebSocket.State == WebSocketState.Open) - { - var receiveResult = - await webSocketSession.WebSocket.ReceiveAsync(new ArraySegment(buffer), - CancellationToken.None); - - if (receiveResult.MessageType == WebSocketMessageType.Text) - { - var message = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count); - MessageReceived?.Invoke(this, new MessageReceivedEventArgs(webSocketSession.SessionId, message)); - } - else if (receiveResult.MessageType == WebSocketMessageType.Close) - { - await webSocketSession.WebSocket.CloseAsync( - WebSocketCloseStatus.NormalClosure, - "Connection closed by the client", - CancellationToken.None); - break; - } - } - } - finally - { - Sessions.TryRemove(webSocketSession.SessionId, out _); - SessionDropped?.Invoke(this, new SessionEventArgs(webSocketSession.SessionId)); - } - } - - public bool RenameSession(string oldSessionId, string newSessionId) - { - if (!Sessions.ContainsKey(oldSessionId) || Sessions.ContainsKey(newSessionId)) - return false; - - if (!Sessions.TryRemove(oldSessionId, out var webSocketSession)) - return false; - - webSocketSession.SessionId = newSessionId; - - if (Sessions.TryAdd(newSessionId, webSocketSession)) - return true; - - webSocketSession.SessionId = oldSessionId; - - if (!Sessions.TryAdd(oldSessionId, webSocketSession)) - throw new Exception("Failed to add back the old session after failed rename"); - - return false; - } - - public async Task SendToSession(string sessionId, string message) - { - try - { - if (Sessions.TryGetValue(sessionId, out var webSocketSession)) - { - var buffer = Encoding.UTF8.GetBytes(message); - await webSocketSession.WebSocket.SendAsync(new ArraySegment(buffer), WebSocketMessageType.Text, - true, - CancellationToken.None); - } - } - catch (WebSocketException ex) - { - if (ex.InnerException is SocketException { SocketErrorCode: SocketError.ConnectionReset }) - { - if (Sessions.ContainsKey(sessionId)) - Sessions.Remove(sessionId, out _); - } - } - } -} - -internal class WsChatBotCommand -{ - [JsonProperty("command")] public string Command { get; set; } = ""; - - [JsonProperty("requestId")] public string RequestId { get; set; } = ""; - - [JsonProperty("parameters")] public object[]? Parameters { get; set; } -} - -internal class WsCommandResponder -{ - private WebSocketBot _bot; - private string _sessionId; - private string _command; - private string _requestId; - - public WsCommandResponder(WebSocketBot bot, string sessionId, string command, string requestId) - { - _bot = bot; - _sessionId = sessionId; - _command = command; - _requestId = requestId; - } - - private void SendCommandResponse(bool success, string result, bool overrideAuth = false) - { - _bot.SendCommandResponse(_sessionId, success, _requestId, _command, result, overrideAuth); - } - - public void SendErrorResponse(string error, bool overrideAuth = false) - { - SendCommandResponse(false, error, overrideAuth); - } - - public void SendSuccessResponse(string result, bool overrideAuth = false) - { - SendCommandResponse(true, result, overrideAuth); - } - - public void SendSuccessResponse(bool overrideAuth = false) - { - SendSuccessResponse(JsonConvert.SerializeObject(true), overrideAuth); - } - - public string Quote(string text) - { - return $"\"{text}\""; - } -} - -internal class NbtData -{ - public NBT? nbt { get; set; } -} - -internal class NBT -{ - public Dictionary? nbt { get; set; } -} - -internal class NbtDictionaryConverter : JsonConverter> -{ - public override void WriteJson(JsonWriter writer, Dictionary? value, JsonSerializer serializer) - => throw new NotImplementedException(); - - public override Dictionary? ReadJson(JsonReader reader, Type objectType, - Dictionary? existingValue, bool hasExistingValue, JsonSerializer serializer) - { - var keyValuePairs = serializer.Deserialize>>(reader); - return new(keyValuePairs!); - } -} - -public class WebSocketBot : ChatBot -{ - private string? _ip; - private int _port; - private string? _password; - private WebSocketServer? _server; - private List _authenticatedSessions; - private List<(string, string)> _waitingEvents; - - public static Configs Config = new(); - - [TomlDoNotInlineObject] - public class Configs - { - [NonSerialized] private const string BotName = "Websocket"; - - public bool Enabled = false; - - [TomlInlineComment("$ChatBot.WebSocketBot.Ip$")] - public string? Ip = "127.0.0.1"; - - [TomlInlineComment("$ChatBot.WebSocketBot.Port$")] - public int Port = 8043; - - [TomlInlineComment("$ChatBot.WebSocketBot.Password$")] - public string? Password = Guid.NewGuid().ToString().Replace("-", "").Trim().ToLower(); - - [TomlInlineComment("$ChatBot.WebSocketBot.DebugMode$")] - public bool DebugMode = false; - - [TomlInlineComment("$ChatBot.WebSocketBot.AllowIpAlias$")] - public bool AllowIpAlias = false; - } - - public WebSocketBot() - { - _password = Config.Password; - _authenticatedSessions = new(); - _waitingEvents = new(); - - var match = Regex.Match(Config.Ip!, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"); - - // If AllowIpAlias is set to true in the config, then always ignore this check - if (!match.Success & !Config.AllowIpAlias!) - { - LogToConsole(Translations.bot_WebSocketBot_failed_to_start_ip); - return; - } - - if (Config.Port > 65535) - { - LogToConsole(string.Format(Translations.bot_WebSocketBot_failed_to_start_port, _port.ToString())); - return; - } - - _ip = Config.Ip; - _port = Config.Port; - } - - public override void Initialize() - { - Task.Run(() => - { - _authenticatedSessions.Clear(); - - if (_server != null) - { - SendEvent("OnWsRestarting", ""); - _server.Stop(); // If you await, this will freeze the task and the websocket won't work - _server = null; - } - - try - { - LogToConsole(Translations.bot_WebSocketBot_starting); - _server = new(); - _server.Start(_ip!, _port); // If you await, this will freeze the task and the websocket won't work - - LogToConsole(string.Format(Translations.bot_WebSocketBot_started, _ip, _port.ToString())); - - foreach (var (eventName, data) in _waitingEvents) - SendEvent(eventName, data); - } - catch (Exception e) - { - LogToConsole(string.Format(Translations.bot_WebSocketBot_failed_to_start_custom, e)); - return; - } - - _server.NewSession += (_, session) => - LogToConsole(string.Format(Translations.bot_WebSocketBot_new_session, session.SessionId)); - _server.SessionDropped += (_, session) => - LogToConsole(string.Format(Translations.bot_WebSocketBot_session_disconnected, session.SessionId)); - - _server.MessageReceived += (_, messageObject) => - { - if (!ProcessWebsocketCommand(messageObject.SessionId, _password!, messageObject.Message)) - return; - - var command = messageObject.Message; - command = command.StartsWith('/') ? command[1..] : $"send {command}"; - - CmdResult response = new(); - PerformInternalCommand(command, ref response); - SendSessionEvent(messageObject.SessionId, "OnMccCommandResponse", $"{{\"response\": \"{response}\"}}"); - }; - }); - } - - private bool ProcessWebsocketCommand(string sessionId, string password, string message) - { - message = message.Trim(); - - if (string.IsNullOrEmpty(message)) - return false; - - if (message.StartsWith('{')) - { - try - { - if (Config.DebugMode) - LogDebugToConsole($"\n\n\tGot command\n\n\t{message}\n\n"); - - var cmd = JsonConvert.DeserializeObject(message)!; - var responder = new WsCommandResponder(this, sessionId, cmd.Command, cmd.RequestId); - - // Allow session name changing without authenticating for easier identification - if (cmd.Command.Equals("ChangeSessionId", StringComparison.OrdinalIgnoreCase)) - { - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expected 1 (newSessionid)!"), true); - return false; - } - - var newId = (cmd.Parameters[0] as string)!; - - switch (newId.Length) - { - case 0: - responder.SendErrorResponse(responder.Quote("Please provide a valid session ID!"), - true); - return false; - case > 32: - responder.SendErrorResponse( - responder.Quote("The session ID can't be longer than 32 characters!"), true); - return false; - } - - if (!_server!.RenameSession(sessionId, newId)) - { - responder.SendErrorResponse( - responder.Quote("Failed to change the session id to: '" + newId + "'"), - true); - LogToConsole(string.Format(Translations.bot_WebSocketBot_session_id_failed_to_change, sessionId, - newId)); - return false; - } - - // If the session is authenticated, remove the old session id and add the new one - if (_authenticatedSessions.Contains(sessionId)) - { - _authenticatedSessions.Remove(sessionId); - _authenticatedSessions.Add(newId); - } - - // Update the responder to the new session id - responder = new WsCommandResponder(this, newId, cmd.Command, cmd.RequestId); - - responder.SendSuccessResponse( - responder.Quote("The session ID was successfully changed to: '" + newId + "'"), true); - LogToConsole(string.Format(Translations.bot_WebSocketBot_session_id_changed, sessionId, newId)); - return false; - } - - // Authentication and session commands - if (password.Length != 0) - { - if (!_authenticatedSessions.Contains(sessionId)) - { - // Special case for authentication - if (cmd.Command.Equals("Authenticate", StringComparison.OrdinalIgnoreCase)) - { - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expected 1 (password)!"), true); - return false; - } - - var pass = (cmd.Parameters[0] as string)!; - - if (pass.Length == 0) - { - responder.SendErrorResponse( - responder.Quote( - "Please provide a valid password! (Example: 'Authenticate password123')"), - true); - return false; - } - - if (!pass.Equals(password)) - { - responder.SendErrorResponse(responder.Quote("Incorrect password provided!"), true); - return false; - } - - _authenticatedSessions.Add(sessionId); - responder.SendSuccessResponse(responder.Quote("Successfully authenticated!"), true); - LogToConsole(string.Format(Translations.bot_WebSocketBot_session_authenticated, sessionId)); - return false; - } - - responder.SendErrorResponse( - responder.Quote("You must authenticate in order to send and receive data!"), true); - return false; - } - } - else - { - if (!_authenticatedSessions.Contains(sessionId)) - { - responder.SendSuccessResponse(responder.Quote("Successfully authenticated!")); - LogToConsole(string.Format(Translations.bot_WebSocketBot_session_authenticated, sessionId)); - _authenticatedSessions.Add(sessionId); - return false; - } - } - - // Process other commands - switch (cmd.Command) - { - case "LogToConsole": - if (cmd.Parameters == null || cmd.Parameters.Length > 1 || cmd.Parameters.Length < 1) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting a single parameter!")); - return false; - } - - LogToConsole((cmd.Parameters[0] as string)!); - responder.SendSuccessResponse(); - break; - - case "LogDebugToConsole": - if (cmd.Parameters == null || cmd.Parameters.Length > 1 || cmd.Parameters.Length < 1) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting a single parameter!")); - return false; - } - - LogDebugToConsole((cmd.Parameters[0] as string)!); - responder.SendSuccessResponse(); - break; - - case "LogToConsoleTranslated": - if (cmd.Parameters == null || cmd.Parameters.Length > 1 || cmd.Parameters.Length < 1) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting a single parameter!")); - return false; - } - - LogToConsoleTranslated((cmd.Parameters[0] as string)!); - responder.SendSuccessResponse(); - break; - - case "LogDebugToConsoleTranslated": - if (cmd.Parameters!.Length > 1 || cmd.Parameters.Length < 1) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting a single parameter!")); - return false; - } - - LogDebugToConsoleTranslated((cmd.Parameters[0] as string)!); - responder.SendSuccessResponse(); - break; - - case "ReconnectToTheServer": - if (cmd.Parameters is not { Length: 2 }) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 2 parameters (extraAttempts, delaySeconds)!")); - return false; - } - - ReconnectToTheServer(Convert.ToInt32(cmd.Parameters[0]), Convert.ToInt32(cmd.Parameters[1])); - responder.SendSuccessResponse(); - break; - - case "DisconnectAndExit": - responder.SendSuccessResponse(); - DisconnectAndExit(); - break; - - case "SendPrivateMessage": - if (cmd.Parameters is not { Length: 2 }) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 2 parameters (player, message)!")); - return false; - } - - SendPrivateMessage((cmd.Parameters[0] as string)!, (cmd.Parameters[1] as string)!); - responder.SendSuccessResponse(); - break; - - case "RunScript": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (filename)!")); - return false; - } - - RunScript((cmd.Parameters[0] as string)!); - responder.SendSuccessResponse(); - break; - - case "GetTerrainEnabled": - responder.SendSuccessResponse(GetTerrainEnabled().ToString().ToLower()); - break; - - case "SetTerrainEnabled": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (enabled)!")); - return false; - } - - SetTerrainEnabled((bool)cmd.Parameters[0]); - responder.SendSuccessResponse(); - break; - - case "GetEntityHandlingEnabled": - responder.SendSuccessResponse(GetEntityHandlingEnabled().ToString().ToLower()); - break; - - case "Sneak": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (on)!")); - return false; - } - - Sneak((bool)cmd.Parameters[0]); - responder.SendSuccessResponse(); - break; - - case "SendEntityAction": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (actionType)!")); - return false; - } - - SendEntityAction(((Protocol.EntityActionType)(Convert.ToInt32(cmd.Parameters[0])))); - responder.SendSuccessResponse(); - break; - - case "DigBlock": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length < 3 || - cmd.Parameters.Length > 5) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 1 or 3 parameter(s) (location, swingArms?, lookAtBlock?)!")); - return false; - } - - var location = new Location(Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), Convert.ToInt32(cmd.Parameters[2])); - - if (location.DistanceSquared(GetCurrentLocation().EyesLocation()) > 25) - { - responder.SendErrorResponse( - responder.Quote("The block you're trying to dig is too far away!")); - return false; - } - - if (GetWorld().GetBlock(location).Type == Material.Air) - { - responder.SendErrorResponse(responder.Quote("The block you're trying to dig is is air!")); - return false; - } - - var result = cmd.Parameters.Length switch - { - 3 => DigBlock(location), - 4 => DigBlock(location, (bool)cmd.Parameters[3]), - 5 => DigBlock(location, (bool)cmd.Parameters[3], (bool)cmd.Parameters[4]), - _ => false - }; - - responder.SendSuccessResponse(JsonConvert.SerializeObject(result)); - break; - - case "SetSlot": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (slotNumber)!")); - return false; - } - - SetSlot(Convert.ToInt32(cmd.Parameters[0])); - responder.SendSuccessResponse(); - break; - - case "GetWorld": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetWorld())); - break; - - case "GetEntities": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetEntities())); - break; - - case "GetPlayersLatency": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetPlayersLatency())); - break; - - case "GetCurrentLocation": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetCurrentLocation())); - break; - - case "MoveToLocation": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length < 3 || - cmd.Parameters.Length > 8) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 1 or 7 parameter(s) (x, y, z, allowUnsafe?, allowDirectTeleport?, maxOffset?, minoffset?, timeout?)!")); - return false; - } - - var allowUnsafe = false; - var allowDirectTeleport = false; - var maxOffset = 0; - var minOffset = 0; - TimeSpan? timeout = null; - - if (cmd.Parameters.Length >= 4) - allowUnsafe = (bool)cmd.Parameters[3]; - - if (cmd.Parameters.Length >= 5) - allowDirectTeleport = (bool)cmd.Parameters[4]; - - if (cmd.Parameters.Length >= 6) - maxOffset = Convert.ToInt32(cmd.Parameters[5]); - - if (cmd.Parameters.Length >= 7) - minOffset = Convert.ToInt32(cmd.Parameters[6]); - - if (cmd.Parameters.Length == 8) - timeout = TimeSpan.FromSeconds(Convert.ToInt32(cmd.Parameters[7])); - - var canMove = MoveToLocation( - new Location(Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), - Convert.ToInt32(cmd.Parameters[2])), - allowUnsafe, - allowDirectTeleport, - maxOffset, - minOffset, - timeout); - - responder.SendSuccessResponse(JsonConvert.SerializeObject(canMove)); - break; - - case "ClientIsMoving": - responder.SendSuccessResponse(JsonConvert.SerializeObject(ClientIsMoving())); - break; - - case "LookAtLocation": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length < 3 || - cmd.Parameters.Length > 3) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 3 parameter(s) (x, y, z)!")); - return false; - } - - LookAtLocation(new Location(Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), Convert.ToInt32(cmd.Parameters[2]))); - responder.SendSuccessResponse(); - break; - - case "GetTimestamp": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetTimestamp())); - break; - - case "GetServerPort": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetServerPort())); - break; - - case "GetServerHost": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetServerHost())); - break; - - case "GetUsername": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetUsername())); - break; - - case "GetGamemode": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GameModeString(GetGamemode()))); - break; - - case "GetYaw": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetYaw())); - break; - - case "GetPitch": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetPitch())); - break; - - case "GetUserUUID": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetUserUUID())); - break; - - case "GetOnlinePlayers": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetOnlinePlayers())); - break; - - case "GetOnlinePlayersWithUUID": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetOnlinePlayersWithUUID())); - break; - - case "GetServerTPS": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetServerTPS())); - break; - - case "InteractEntity": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length < 2 || - cmd.Parameters.Length > 3) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting at least 2 and at most 3 parameter(s) (entityId, interactionType, hand?)!")); - return false; - } - - var interactionType = (InteractType)Convert.ToInt32(cmd.Parameters[1]); - var interactionHand = Hand.MainHand; - - if (cmd.Parameters.Length == 3) - interactionHand = (Hand)Convert.ToInt32(cmd.Parameters[2]); - - responder.SendSuccessResponse(JsonConvert.SerializeObject( - InteractEntity(Convert.ToInt32(cmd.Parameters[0]), interactionType, interactionHand))); - break; - - case "CreativeGive": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length < 3 || - cmd.Parameters.Length > 4) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting at least 3 and at most 4 parameter(s) (slotId, itemType, count, nbt?)!")); - return false; - } - - NBT? nbt = null; - - if (cmd.Parameters.Length == 4) - nbt = JsonConvert.DeserializeObject(cmd.Parameters[3].ToString()!, - new NbtDictionaryConverter())!; - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(CreativeGive( - Convert.ToInt32(cmd.Parameters[0]), - (ItemType)Convert.ToInt32(cmd.Parameters[1]), - Convert.ToInt32(cmd.Parameters[2]), - nbt == null ? new Dictionary() : nbt!.nbt!) - )); - - break; - - case "CreativeDelete": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting at 1 parameter (slotId)!")); - return false; - } - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(CreativeDelete(Convert.ToInt32(cmd.Parameters[0])))); - break; - - case "SendAnimation": - var hand = Hand.MainHand; - - if (cmd.Parameters is { Length: 1 }) - hand = (Hand)Convert.ToInt32(cmd.Parameters[0]); - - responder.SendSuccessResponse(JsonConvert.SerializeObject(SendAnimation(hand))); - break; - - case "SendPlaceBlock": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length < 4 || - cmd.Parameters.Length > 4) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting at least 4 and at most 5 parameters (x, y, z, blockFace, hand?)!")); - return false; - } - - var blockLocation = new Location(Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), Convert.ToInt32(cmd.Parameters[2])); - var blockFacingDirection = (Direction)Convert.ToInt32(cmd.Parameters[3]); - var handToUse = Hand.MainHand; - - if (cmd.Parameters.Length == 4) - handToUse = (Hand)Convert.ToInt32(cmd.Parameters[4]); - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(SendPlaceBlock(blockLocation, blockFacingDirection, - handToUse))); - break; - - case "UseItemInHand": - responder.SendSuccessResponse(JsonConvert.SerializeObject(UseItemInHand())); - break; - - case "GetInventoryEnabled": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetInventoryEnabled())); - break; - - case "GetPlayerInventory": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetPlayerInventory())); - break; - - case "GetInventories": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetInventories())); - break; - - case "WindowAction": - if (cmd.Parameters == null || cmd.Parameters.Length == 0 || cmd.Parameters.Length != 3) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 3 parameters (inventoryId, slotId, windowActionType)!")); - return false; - } - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(WindowAction( - Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), - (WindowActionType)Convert.ToInt32(cmd.Parameters[2]) - ))); - break; - - case "ChangeSlot": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (slotId)!")); - return false; - } - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(ChangeSlot((short)Convert.ToInt32(cmd.Parameters[0])))); - break; - - case "GetCurrentSlot": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetCurrentSlot())); - break; - - case "ClearInventories": - responder.SendSuccessResponse(JsonConvert.SerializeObject(ClearInventories())); - break; - - case "UpdateSign": - if (cmd.Parameters is not { Length: 7 }) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 1 parameter (x, y, z, line1, line2, line3, line4)!")); - return false; - } - - var signLocation = new Location(Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), Convert.ToInt32(cmd.Parameters[2])); - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(UpdateSign(signLocation, - (string)cmd.Parameters[3], - (string)cmd.Parameters[4], - (string)cmd.Parameters[5], - (string)cmd.Parameters[6] - ))); - break; - - case "SelectTrade": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (selectedSlot)!")); - return false; - } - - responder.SendSuccessResponse( - JsonConvert.SerializeObject(SelectTrade(Convert.ToInt32(cmd.Parameters[0])))); - break; - - case "UpdateCommandBlock": - if (cmd.Parameters is not { Length: 6 }) - { - responder.SendErrorResponse(responder.Quote( - "Invalid number of parameters, expecting 1 parameter (x, y, z, command, commandBlockMode, commandBlockFlags)!")); - return false; - } - - var commandBlockLocation = new Location(Convert.ToInt32(cmd.Parameters[0]), - Convert.ToInt32(cmd.Parameters[1]), Convert.ToInt32(cmd.Parameters[2])); - - responder.SendSuccessResponse( - UpdateCommandBlock(commandBlockLocation, - (string)cmd.Parameters[3], - (CommandBlockMode)Convert.ToInt32(cmd.Parameters[4]), - (CommandBlockFlags)Convert.ToInt32(cmd.Parameters[5]) - ).ToString().ToLower()); - break; - - case "CloseInventory": - if (cmd.Parameters is not { Length: 1 }) - { - responder.SendErrorResponse( - responder.Quote("Invalid number of parameters, expecting 1 parameter (inventoryId)!")); - return false; - } - - responder.SendSuccessResponse(CloseInventory(Convert.ToInt32(cmd.Parameters[0])).ToString() - .ToLower()); - break; - - case "GetMaxChatMessageLength": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetMaxChatMessageLength())); - break; - - case "Respawn": - responder.SendSuccessResponse(JsonConvert.SerializeObject(Respawn())); - break; - - case "GetProtocolVersion": - responder.SendSuccessResponse(JsonConvert.SerializeObject(GetProtocolVersion())); - break; - - default: - responder.SendErrorResponse( - responder.Quote($"Unknown command {cmd.Command} received!")); - break; - } - } - catch (Exception e) - { - LogDebugToConsole(e.Message); - SendSessionEvent(sessionId, "OnWsCommandResponse", - "{\"success\": false, \"message\": \"An error occured, possible reasons: mail-formed json, type conversion, internal error\", \"stackTrace\": \"" + - Json.EscapeString(e.ToString()) + "\"}", true); - return false; - } - - return false; - } - - if (password.Length != 0) - { - if (!_authenticatedSessions.Contains(sessionId)) - { - SendSessionEvent(sessionId, "OnWsCommandResponse", - "{\"error\": true, \"message\": \"You must authenticate in order to send and receive data!\"}", - true); - return false; - } - } - else - { - if (!_authenticatedSessions.Contains(sessionId)) - { - SendSessionEvent(sessionId, "OnWsCommandResponse", - "{\"success\": true, \"message\": \"Successfully authenticated!\"}", true); - LogToConsole(string.Format(Translations.bot_WebSocketBot_session_authenticated, sessionId)); - _authenticatedSessions.Add(sessionId); - } - } - - return true; - } - - public override void OnUnload() - { - if (_server != null) - { - SendEvent("OnWsConnectionClose", ""); - _server.Stop(); - _server = null; - } - - _authenticatedSessions.Clear(); - } - - // ========================================================================================== - // Bot Events - // ========================================================================================== - public override void AfterGameJoined() - { - // Workaround to wait until the WebSocket server has been started - // This would fire before the WS server is started, this causing a null exception. - _waitingEvents.Add(("OnGameJoined", "")); - } - - public override void OnBlockBreakAnimation(Entity entity, Location location, byte stage) - { - SendEvent("OnBlockBreakAnimation", new { entity, location, stage }); - } - - public override void OnEntityAnimation(Entity entity, byte animation) - { - SendEvent("OnEntityAnimation", new { entity, animation }); - } - - public override void GetText(string text) - { - text = GetVerbatim(text).Trim(); - - var message = ""; - var username = ""; - - if (IsPrivateMessage(text, ref message, ref username)) - SendEvent("OnChatPrivate", new { sender = username, message, rawText = text }); - else if (IsChatMessage(text, ref message, ref username)) - SendEvent("OnChatPublic", new { username, message, rawText = text }); - else if (IsTeleportRequest(text, ref username)) - SendEvent("OnTeleportRequest", new { sender = username, rawText = text }); - } - - public override void GetText(string text, string? json) - { - SendEvent("OnChatRaw", new { text, json }); - } - - public override bool OnDisconnect(DisconnectReason reason, string message) - { - var reasonString = reason switch - { - DisconnectReason.ConnectionLost => "Connection Lost", - DisconnectReason.UserLogout => "User Logout", - DisconnectReason.InGameKick => "In-Game Kick", - DisconnectReason.LoginRejected => "Login Rejected", - _ => "Unknown" - }; - - SendEvent("OnDisconnect", new { reason = reasonString, message }); - return false; - } - - public override void OnPlayerProperty(Dictionary prop) - { - SendEvent("OnPlayerProperty", prop); - } - - public override void OnServerTpsUpdate(double tps) - { - SendEvent("OnServerTpsUpdate", new { tps }); - } - - public override void OnTimeUpdate(long worldAge, long timeOfDay) - { - SendEvent("OnTimeUpdate", new { worldAge, timeOfDay }); - } - - public override void OnEntityMove(Entity entity) - { - SendEvent("OnEntityMove", entity); - } - - public override void OnInternalCommand(string commandName, string commandParams, CmdResult result) - { - SendEvent("OnInternalCommand", - new { command = commandName, parameters = commandParams, result = result.ToString().Replace("\"", "'") }); - } - - public override void OnEntitySpawn(Entity entity) - { - SendEvent("OnEntitySpawn", entity); - } - - public override void OnEntityDespawn(Entity entity) - { - SendEvent("OnEntityDespawn", entity); - } - - public override void OnHeldItemChange(byte slot) - { - SendEvent("OnHeldItemChange", new { itemSlot = slot }); - } - - public override void OnHealthUpdate(float health, int food) - { - SendEvent("OnHealthUpdate", new { health, food }); - } - - public override void OnExplosion(Location explode, float strength, int recordCount) - { - SendEvent("OnExplosion", new { location = explode, strength, recordCount }); - } - - public override void OnSetExperience(float experienceBar, int level, int totalExperience) - { - SendEvent("OnSetExperience", - new { experienceBar, level, totalExperience }); - } - - public override void OnGamemodeUpdate(string playerName, Guid uuid, int gameMode) - { - SendEvent("OnGamemodeUpdate", new { playerName, uuid, gameMode = GameModeString(gameMode) }); - } - - public override void OnLatencyUpdate(string playerName, Guid uuid, int latency) - { - SendEvent("OnLatencyUpdate", new { playerName, uuid, latency }); - } - - public override void OnMapData(int mapId, byte scale, bool trackingPosition, bool locked, List icons, - byte columnsUpdated, byte rowsUpdated, byte mapColumnX, byte mapRowZ, byte[]? colors) - { - SendEvent("OnMapData", - new - { - mapId, scale, trackingPosition, locked, icons, columnsUpdated, rowsUpdated, mapColumnX, mapRowZ, - colors - }); - } - - public override void OnTradeList(int windowId, List trades, VillagerInfo villagerInfo) - { - SendEvent("OnTradeList", new { windowId, trades, villagerInfo }); - } - - public override void OnTitle(int action, string titleText, string subtitleText, string actionBarText, int fadein, - int stay, int fadeout, string json_) - { - SendEvent("OnTitle", - new - { - action, titleText, subtitleText, actionBarText, - fadeIn = fadein, stay, rawJson = json_ - }); - } - - public override void OnEntityEquipment(Entity entity, int slot, Item? item) - { - SendEvent("OnEntityEquipment", new { entity, slot, item }); - } - - public override void OnEntityEffect(Entity entity, Effects effect, int amplifier, int duration, byte flags) - { - SendEvent("OnEntityEffect", new { entity, effect, amplifier, duration, flags }); - } - - public override void OnScoreboardObjective(string objectiveName, byte mode, string objectiveValue, int type, - string json_, int numberFormat) - { - SendEvent("OnScoreboardObjective", - new { objectiveName, mode, objectiveValue, type, rawJson = json_, numberFormat }); - } - - public override void OnUpdateScore(string entityName, int action, string objectiveName, string objectiveDisplayName, int value, int numberFormat) - { - SendEvent("OnUpdateScore", - new { entityName, action, objectiveName, objectiveDisplayName, type = value, numberFormat }); - } - - public override void OnInventoryUpdate(int inventoryId) - { - SendEvent("OnInventoryUpdate", new { inventoryId }); - } - - public override void OnInventoryOpen(int inventoryId) - { - SendEvent("OnInventoryOpen", new { inventoryId }); - } - - public override void OnInventoryClose(int inventoryId) - { - SendEvent("OnInventoryClose", new { inventoryId }); - } - - public override void OnPlayerJoin(Guid uuid, string name) - { - SendEvent("OnPlayerJoin", new { uuid, name }); - } - - public override void OnPlayerLeave(Guid uuid, string? name) - { - SendEvent("OnPlayerLeave", new { uuid, name = name ?? "null" }); - } - - public override void OnDeath() - { - SendEvent("OnDeath", ""); - } - - public override void OnRespawn() - { - SendEvent("OnRespawn", ""); - } - - public override void OnEntityHealth(Entity entity, float health) - { - SendEvent("OnEntityHealth", new { entity, health }); - } - - public override void OnEntityMetadata(Entity entity, Dictionary? metadata) - { - SendEvent("OnEntityMetadata", new { entity, metadata }); - } - - public override void OnPlayerStatus(byte statusId) - { - SendEvent("OnPlayerStatus", new { statusId }); - } - - public override void OnNetworkPacket(int packetID, List packetData, bool isLogin, bool isInbound) - { - SendEvent("OnNetworkPacket", new { packetId = packetID, isLogin, isInbound, packetData }); - } - - // ========================================================================================== - // Helper methods - // ========================================================================================== - - private void SendEvent(string type, object data, bool overrideAuth = false) - { - if (_server == null) - return; - - foreach (var (sessionId, _) in _server!.Sessions) - SendSessionEvent(sessionId, type, JsonConvert.SerializeObject(data), overrideAuth); - } - - private void SendEvent(string type, string data, bool overrideAuth = false) - { - if (_server == null) - return; - - foreach (var (sessionId, _) in _server.Sessions) - SendSessionEvent(sessionId, type, data, overrideAuth); - } - - private void SendSessionEvent(string sessionId, string type, string data, bool overrideAuth = false) - { - if (sessionId.Length > 0 && (overrideAuth || _authenticatedSessions.Contains(sessionId))) - { - _server?.SendToSession(sessionId, - $"{{\"event\": \"{type}\", \"data\": {(string.IsNullOrEmpty(data) ? "null" : $"\"{Json.EscapeString(data)}\"")}}}") - .Wait(); - - if (!(type.Contains("Entity") || type.Equals("OnTimeUpdate") || type.Equals("OnServerTpsUpdate")) && - Config.DebugMode) - LogDebugToConsole( - $"\n\n\tSending:\n\n\t{{\"event\": \"{type}\", \"data\": {(string.IsNullOrEmpty(data) - ? "null" - : $"\"{Json.EscapeString(data)}\"")}}}\n\n"); - } - } - - public void SendCommandResponse(string sessionId, bool success, string requestId, string command, - string result, bool overrideAuth = false) - { - SendSessionEvent(sessionId, "OnWsCommandResponse", - $"{{\"success\": {success.ToString().ToLower()}, \"requestId\": \"{requestId}\", \"command\": \"{command}\", \"result\": {(string.IsNullOrEmpty(result) ? "null" : result)}}}", - overrideAuth); - } - - private static string GameModeString(int gameMode) - { - return gameMode switch - { - 0 => "survival", - 1 => "creative", - 2 => "adventure", - 3 => "spectator", - _ => "unknown" - }; - } -} \ No newline at end of file diff --git a/MinecraftClient/Commands/Dig.cs b/MinecraftClient/Commands/Dig.cs index 3a00c44b..477e2c77 100644 --- a/MinecraftClient/Commands/Dig.cs +++ b/MinecraftClient/Commands/Dig.cs @@ -22,6 +22,7 @@ namespace MinecraftClient.Commands ); dispatcher.Register(l => l.Literal(CmdName) + // TODO Get blockFace direction from arguments .Executes(r => DigLookAt(r.Source)) .Then(l => l.Argument("Duration", Arguments.Double()) .Executes(r => DigLookAt(r.Source, Arguments.GetDouble(r, "Duration")))) @@ -58,7 +59,7 @@ namespace MinecraftClient.Commands Block block = handler.GetWorld().GetBlock(blockToBreak); if (block.Type == Material.Air) return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); - else if (handler.DigBlock(blockToBreak, duration: duration)) + else if (handler.DigBlock(blockToBreak, Direction.Down, duration: duration)) { blockToBreak = blockToBreak.ToCenter(); return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockToBreak.X, blockToBreak.Y, blockToBreak.Z, block.GetTypeString())); @@ -78,7 +79,7 @@ namespace MinecraftClient.Commands return r.SetAndReturn(Status.Fail, Translations.cmd_dig_too_far); else if (block.Type == Material.Air) return r.SetAndReturn(Status.Fail, Translations.cmd_dig_no_block); - else if (handler.DigBlock(blockLoc, lookAtBlock: false, duration: duration)) + else if (handler.DigBlock(blockLoc, Direction.Down, lookAtBlock: false, duration: duration)) return r.SetAndReturn(Status.Done, string.Format(Translations.cmd_dig_dig, blockLoc.X, blockLoc.Y, blockLoc.Z, block.GetTypeString())); else return r.SetAndReturn(Status.Fail, Translations.cmd_dig_fail); diff --git a/MinecraftClient/Mapping/DirectionExtensions.cs b/MinecraftClient/Mapping/DirectionExtensions.cs new file mode 100644 index 00000000..9a42368c --- /dev/null +++ b/MinecraftClient/Mapping/DirectionExtensions.cs @@ -0,0 +1,63 @@ +using System; + +namespace MinecraftClient.Mapping +{ + public static class DirectionExtensions + { + public static Direction GetOpposite(this Direction direction) + { + switch (direction) + { + case Direction.SouthEast: + return Direction.NorthEast; + case Direction.SouthWest: + return Direction.NorthWest; + + case Direction.NorthEast: + return Direction.SouthEast; + case Direction.NorthWest: + return Direction.SouthWest; + + case Direction.West: + return Direction.East; + case Direction.East: + return Direction.West; + + case Direction.North: + return Direction.South; + case Direction.South: + return Direction.North; + + case Direction.Down: + return Direction.Up; + case Direction.Up: + return Direction.Down; + default: + return Direction.Up; + + } + } + + + public static Direction[] HORIZONTAL = + { + Direction.South, + Direction.West, + Direction.North, + Direction.East + }; + + public static Direction FromRotation(double rotation) + { + double floor = Math.Floor((rotation / 90.0) + 0.5); + int value = (int)floor & 3; + + return FromHorizontal(value); + } + + public static Direction FromHorizontal(int value) + { + return HORIZONTAL[Math.Abs(value % HORIZONTAL.Length)]; + } + } +} diff --git a/MinecraftClient/Mapping/World.cs b/MinecraftClient/Mapping/World.cs index f2f285b4..b6240ffc 100644 --- a/MinecraftClient/Mapping/World.cs +++ b/MinecraftClient/Mapping/World.cs @@ -19,7 +19,7 @@ namespace MinecraftClient.Mapping /// /// The dimension info of the world /// - private static Dimension curDimension = new(); + private static Dimension curDimension= new(); private static readonly Dictionary dimensionList = new(); @@ -230,10 +230,32 @@ namespace MinecraftClient.Mapping /// /// The name of the dimension type /// The dimension type (NBT Tag Compound) - public static void SetDimension(string name) - { - curDimension = dimensionList[name]; // Should not fail - } + public static void SetDimension(string name) + { + // Try to get the dimension using the name as is + if (dimensionList.TryGetValue(name, out Dimension dimension)) + { + curDimension = dimension; + return; // Dimension found + } + + // If not found, check if name lacks 'minecraft:' prefix and try again + if (!name.StartsWith("minecraft:")) + { + string prefixedName = "minecraft:" + name; + if (dimensionList.TryGetValue(prefixedName, out dimension)) + { + curDimension = dimension; + return; // Dimension found with prefixed name + } + } + + // If still not found, dimension does not exist + throw new KeyNotFoundException($"Dimension '{name}' not found in dimensions dictionary."); + } + + + /// /// Get current dimension diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs index 50761914..96dcb615 100644 --- a/MinecraftClient/McClient.cs +++ b/MinecraftClient/McClient.cs @@ -425,7 +425,6 @@ namespace MinecraftClient if (Config.ChatBot.ScriptScheduler.Enabled) { BotLoad(new ScriptScheduler()); } if (Config.ChatBot.TelegramBridge.Enabled) { BotLoad(new TelegramBridge()); } if (Config.ChatBot.ItemsCollector.Enabled) { BotLoad(new ItemsCollector()); } - if (Config.ChatBot.WebSocketBot.Enabled) { BotLoad(new WebSocketBot()); } //Add your ChatBot here by uncommenting and adapting //BotLoad(new ChatBots.YourBot()); } @@ -1166,6 +1165,15 @@ namespace MinecraftClient #region Getters: Retrieve data for use in other methods or ChatBots + /// + /// Gets the horizontal direction of the takeoff. + /// + /// Return direction of view + public Direction GetHorizontalFacing() + { + return DirectionExtensions.FromRotation(GetYaw()); + } + /// /// Get max length for chat messages /// @@ -2390,22 +2398,22 @@ namespace MinecraftClient return InvokeOnMainThread(() => handler.SendPlayerBlockPlacement((int)hand, location, blockFace, sequenceId++)); } + /// /// Attempt to dig a block at the specified location /// /// Location of block to dig /// Also perform the "arm swing" animation /// Also look at the block before digging - public bool DigBlock(Location location, bool swingArms = true, bool lookAtBlock = true, double duration = 0) + public bool DigBlock(Location location, Direction blockFace, bool swingArms = true, bool lookAtBlock = true, double duration = 0) { + // TODO select best face from current player location + if (!GetTerrainEnabled()) return false; if (InvokeRequired) - return InvokeOnMainThread(() => DigBlock(location, swingArms, lookAtBlock, duration)); - - // TODO select best face from current player location - Direction blockFace = Direction.Down; + return InvokeOnMainThread(() => DigBlock(location, blockFace, swingArms, lookAtBlock, duration)); lock (DigLock) { diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index f8a8c427..f552b2f9 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; @@ -749,7 +749,8 @@ namespace MinecraftClient.Protocol.Handlers { case >= MC_1_16_2_Version and <= MC_1_18_2_Version: World.StoreOneDimension(dimensionName, dimensionType!); - World.SetDimension(dimensionName); + // World.SetDimension(dimensionName); + World.SetDimension(dimensionName); break; case < MC_1_20_6_Version: World.SetDimension(dimensionTypeName!); @@ -2234,7 +2235,7 @@ namespace MinecraftClient.Protocol.Handlers { var windowId = dataTypes.ReadNextByte(packetData); var stateId = -1; - var elements = 0; + int elements; if (protocolVersion >= MC_1_17_1_Version) { @@ -2245,7 +2246,7 @@ namespace MinecraftClient.Protocol.Handlers else { // Elements as Short - 1.17.0 and below - dataTypes.ReadNextShort(packetData); + elements = dataTypes.ReadNextShort(packetData); } Dictionary inventorySlots = new(); diff --git a/MinecraftClient/Protocol/Message/ChatParser.cs b/MinecraftClient/Protocol/Message/ChatParser.cs index b540e3b6..d3db4e38 100644 --- a/MinecraftClient/Protocol/Message/ChatParser.cs +++ b/MinecraftClient/Protocol/Message/ChatParser.cs @@ -56,9 +56,26 @@ namespace MinecraftClient.Protocol.Message public static void ReadChatType(Dictionary registryCodec) { - var chatTypeDictionary = ChatId2Type ?? new Dictionary(); - var chatTypeListNbt = - (object[])(((Dictionary)registryCodec["minecraft:chat_type"])["value"]); + Dictionary chatTypeDictionary = ChatId2Type ?? new(); + + // Check if the chat type registry is in the correct format + if (!registryCodec.ContainsKey("minecraft:chat_type")) { + + // If not, then we force the registry to be in the correct format + if (registryCodec.ContainsKey("chat_type")) { + + foreach (var key in registryCodec.Keys.ToArray()) { + // Skip entries with a namespace already + if (key.Contains(':', StringComparison.OrdinalIgnoreCase)) continue; + + // Assume all other entries are in the minecraft namespace + registryCodec["minecraft:" + key] = registryCodec[key]; + registryCodec.Remove(key); + } + } + } + + var chatTypeListNbt = (object[])(((Dictionary)registryCodec["minecraft:chat_type"])["value"]); foreach (var (chatName, chatId) in from Dictionary chatTypeNbt in chatTypeListNbt let chatName = (string)chatTypeNbt["name"] let chatId = (int)chatTypeNbt["id"] diff --git a/MinecraftClient/Scripting/ChatBot.cs b/MinecraftClient/Scripting/ChatBot.cs index eff94a09..651c0eb3 100644 --- a/MinecraftClient/Scripting/ChatBot.cs +++ b/MinecraftClient/Scripting/ChatBot.cs @@ -1075,11 +1075,12 @@ namespace MinecraftClient.Scripting /// Attempt to dig a block at the specified location /// /// Location of block to dig + /// Example: if your player is under a block that is being destroyed, use Down /// Also perform the "arm swing" animation /// Also look at the block before digging - protected bool DigBlock(Location location, bool swingArms = true, bool lookAtBlock = true) + protected bool DigBlock(Location location, Direction direction, bool swingArms = true, bool lookAtBlock = true) { - return Handler.DigBlock(location, swingArms, lookAtBlock); + return Handler.DigBlock(location, direction, swingArms, lookAtBlock); } /// @@ -1633,6 +1634,15 @@ namespace MinecraftClient.Scripting return Handler.GetProtocolVersion(); } + /// + /// Gets the horizontal direction of the takeoff. + /// + /// Return direction of view + protected Direction GetHorizontalFacing() + { + return Handler.GetHorizontalFacing(); + } + /// /// Invoke a task on the main thread, wait for completion and retrieve return value. /// diff --git a/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs b/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs index 9bd865c2..1e99f226 100644 --- a/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs +++ b/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs @@ -94,7 +94,15 @@ namespace MinecraftClient.Scripting.DynamicRun.Builder { if (file.EndsWith("mcc-executable")) { - useExisting = true; + // Check if the file is the same as the current executable. + if (File.ReadAllBytes(file).SequenceEqual(File.ReadAllBytes(executablePath))) + { + useExisting = true; + break; + } + + // If not, refresh the cache. + File.Delete(file); break; } } diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs index d8d564c9..684e5a98 100644 --- a/MinecraftClient/Settings.cs +++ b/MinecraftClient/Settings.cs @@ -1429,19 +1429,16 @@ namespace MinecraftClient get { return ChatBots.TelegramBridge.Config; } set { ChatBots.TelegramBridge.Config = value; ChatBots.TelegramBridge.Config.OnSettingUpdate(); } } - + [TomlPrecedingComment("$ChatBot.ItemsCollector$")] public ChatBots.ItemsCollector.Configs ItemsCollector { get { return ChatBots.ItemsCollector.Config; } - set { ChatBots.ItemsCollector.Config = value; ChatBots.ItemsCollector.Config.OnSettingUpdate(); } - } - - [TomlPrecedingComment("$ChatBot.WebSocketBot$")] - public ChatBots.WebSocketBot.Configs WebSocketBot - { - get { return ChatBots.WebSocketBot.Config!; } - set { ChatBots.WebSocketBot.Config = value; } + set + { + ChatBots.ItemsCollector.Config = value; + ChatBots.ItemsCollector.Config.OnSettingUpdate(); + } } } } diff --git a/docs/yarn.lock b/docs/yarn.lock index 7c3cb3be..6449375a 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -52,16 +52,35 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" @@ -70,12 +89,33 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -217,31 +257,10 @@ dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.9" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.9.tgz#f7371980148697f4b582b086630319b55324b5aa" - integrity sha512-jFCSo4wJzlHQLCpceUhUnXdrPuCNOjGFMQ8Eg6JXxlz3QaCKOb7eGi2cephQdM4XTYsNej69P9JDJ1zqNIbncQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": version "4.17.31" @@ -286,7 +305,7 @@ dependencies: "@types/node" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -796,125 +815,125 @@ dependencies: vue-demi "*" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -935,16 +954,21 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn@^8.5.0, acorn@^8.7.1: version "8.8.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +acorn@^8.8.2: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -1209,7 +1233,17 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.4: +browserslist@^4.21.10: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +browserslist@^4.21.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -1288,6 +1322,11 @@ caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001429.tgz#70cdae959096756a85713b36dd9cb82e62325639" integrity sha512-511ThLu1hF+5RRRt0zYCf2U2yRr9GPF6m5y90SBCWsvSoYoW7yAGlv/elyPaNfvGCkp6kj/KFZWU0BMA69Prsg== +caniuse-lite@^1.0.30001646: + version "1.0.30001655" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f" + integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg== + chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1536,9 +1575,9 @@ cosmiconfig@^7.0.0: yaml "^1.10.0" cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -2285,6 +2324,11 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.5.4: + version "1.5.13" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" + integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -2295,10 +2339,10 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -enhanced-resolve@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2325,10 +2369,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== esbuild-android-64@0.15.12: version "0.15.12" @@ -2475,6 +2519,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2849,11 +2898,16 @@ globby@^13.1.1, globby@^13.1.2: merge2 "^1.4.1" slash "^4.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.2.11: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + graphlib@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" @@ -3691,9 +3745,9 @@ multicast-dns@^7.2.5: thunky "^1.0.2" nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== nanomatch@^1.2.9: version "1.2.13" @@ -3735,6 +3789,11 @@ node-forge@^1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" @@ -3954,6 +4013,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -4047,9 +4111,9 @@ pretty-error@^4.0.0: renderkid "^3.0.0" prismjs@^1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + version "1.30.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" + integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== process-nextick-args@~2.0.0: version "2.0.1" @@ -4287,7 +4351,7 @@ sass@^1.55.0: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -4296,6 +4360,15 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" @@ -4352,10 +4425,10 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -4674,18 +4747,18 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" -terser@^5.10.0, terser@^5.14.1: +terser@^5.10.0: version "5.15.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== @@ -4695,6 +4768,16 @@ terser@^5.10.0, terser@^5.14.1: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.26.0: + version "5.31.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" + integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -4801,6 +4884,14 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4949,10 +5040,10 @@ vuepress@^2.0.0-beta.53: dependencies: vuepress-vite "2.0.0-beta.53" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -5047,33 +5138,32 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.74.0: - version "5.76.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" - integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== + version "5.94.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f" + integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg== dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: