Added PowerShell script snippets to editor
This commit is contained in:
parent
7f93f806fd
commit
58e4886441
22 changed files with 154 additions and 7 deletions
|
@ -9,7 +9,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LANCommander.PlaynitePlugin
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LANCommander.SDK", "LANCommander.SDK\LANCommander.SDK.csproj", "{4C2A71FD-A30B-4D62-888A-4EF843D8E506}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LANCommander.SDK", "LANCommander.SDK\LANCommander.SDK.csproj", "{4C2A71FD-A30B-4D62-888A-4EF843D8E506}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LANCommander.PCGamingWiki", "LANCommander.PCGamingWiki\LANCommander.PCGamingWiki.csproj", "{2436B817-4475-4E70-9BB2-E1E7866DB79F}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LANCommander.PCGamingWiki", "LANCommander.PCGamingWiki\LANCommander.PCGamingWiki.csproj", "{2436B817-4475-4E70-9BB2-E1E7866DB79F}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|
32
LANCommander/Components/SnippetBar.razor
Normal file
32
LANCommander/Components/SnippetBar.razor
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
@using LANCommander.Models;
|
||||||
|
@using LANCommander.Services;
|
||||||
|
@inject IJSRuntime JS
|
||||||
|
|
||||||
|
@foreach (var group in Snippets.Select(s => s.Group).Distinct())
|
||||||
|
{
|
||||||
|
<div class="dropdown">
|
||||||
|
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
@group
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
@foreach (var snippet in Snippets.Where(s => s.Group == group))
|
||||||
|
{
|
||||||
|
<li><a class="dropdown-item" @onclick="() => InsertSnippet(snippet)">@snippet.Name</a></li>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@code {
|
||||||
|
public IEnumerable<Snippet> Snippets { get; set; }
|
||||||
|
|
||||||
|
protected override void OnInitialized()
|
||||||
|
{
|
||||||
|
Snippets = ScriptService.GetSnippets();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task InsertSnippet(Snippet snippet) {
|
||||||
|
await JS.InvokeVoidAsync("Editor.trigger", "keyboard", "type", new { text = snippet.Content });
|
||||||
|
}
|
||||||
|
}
|
9
LANCommander/Models/Snippet.cs
Normal file
9
LANCommander/Models/Snippet.cs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
namespace LANCommander.Models
|
||||||
|
{
|
||||||
|
public class Snippet
|
||||||
|
{
|
||||||
|
public string Group { get; set; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Content { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
using LANCommander.Data;
|
using LANCommander.Data;
|
||||||
using LANCommander.Data.Models;
|
using LANCommander.Data.Models;
|
||||||
|
using LANCommander.Models;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
|
||||||
namespace LANCommander.Services
|
namespace LANCommander.Services
|
||||||
{
|
{
|
||||||
|
@ -8,5 +10,22 @@ namespace LANCommander.Services
|
||||||
public ScriptService(DatabaseContext dbContext, IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
public ScriptService(DatabaseContext dbContext, IHttpContextAccessor httpContextAccessor) : base(dbContext, httpContextAccessor)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<Snippet> GetSnippets()
|
||||||
|
{
|
||||||
|
var files = Directory.GetFiles(@"Snippets", "*.ps1", SearchOption.AllDirectories);
|
||||||
|
|
||||||
|
return files.Select(f =>
|
||||||
|
{
|
||||||
|
var split = f.Split('\\');
|
||||||
|
|
||||||
|
return new Snippet()
|
||||||
|
{
|
||||||
|
Name = Path.GetFileNameWithoutExtension(f),
|
||||||
|
Group = split[1],
|
||||||
|
Content = File.ReadAllText(f)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
1
LANCommander/Snippets/Examples/Copy Directory.ps1
Normal file
1
LANCommander/Snippets/Examples/Copy Directory.ps1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Copy-Item -Path "$InstallDir\<Source Path>" -Destination "$InstallDir\<Destination Path>" -Recurse
|
1
LANCommander/Snippets/Examples/Create Directory.ps1
Normal file
1
LANCommander/Snippets/Examples/Create Directory.ps1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
New-Item -ItemType Directory -Force -Path "$InstallDir\<Path>"
|
2
LANCommander/Snippets/Examples/Create Registry Path.ps1
Normal file
2
LANCommander/Snippets/Examples/Create Registry Path.ps1
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Non-destructively creates path in registry
|
||||||
|
New-Item -Path "HKLM:\SOFTWARE\WOW6432Node\<Path>"
|
2
LANCommander/Snippets/Examples/Patch Binary.ps1
Normal file
2
LANCommander/Snippets/Examples/Patch Binary.ps1
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Writes byte[] to a file at an offset
|
||||||
|
Patch-Binary -FilePath "$InstallDir\<File Path>" -Offset 0x00 -Data $bytes
|
1
LANCommander/Snippets/Examples/Remove Directory.ps1
Normal file
1
LANCommander/Snippets/Examples/Remove Directory.ps1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Remove-Item "$InstallDir\<DirectoryPath>" -Recurse -ErrorAction Ignore
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Use regex to replace text within a file. Quotes are escaped by double quoting ("")
|
||||||
|
Write-ReplaceContentInFile -Regex '^game.setPlayerName "(.+)"' -Replacement "game.setPlayerName ""$NewName""" -FilePath "$InstallDir\<File Path>"
|
2
LANCommander/Snippets/Examples/Set Registry Key.ps1
Normal file
2
LANCommander/Snippets/Examples/Set Registry Key.ps1
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Creates or updates a key in the registry
|
||||||
|
New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\<Path>" -Name "KeyName" -Value "New Value" -Force
|
2
LANCommander/Snippets/Examples/String to ASCII Bytes.ps1
Normal file
2
LANCommander/Snippets/Examples/String to ASCII Bytes.ps1
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Convert an input string to ASCII-encoded byte[]. Shorter strings will pad out to 12 bytes, longer strings will be trimmed.
|
||||||
|
$bytes = Get-AsciiBytes -InputString "Hello world!" -MaxLength 12
|
4
LANCommander/Snippets/Examples/Trim String.ps1
Normal file
4
LANCommander/Snippets/Examples/Trim String.ps1
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Trim a string down to a specified amount of characters
|
||||||
|
if ($NewName.Length -gt 10) {
|
||||||
|
$NewName = $NewName.Substring(0, 10);
|
||||||
|
}
|
2
LANCommander/Snippets/Examples/Write to File.ps1
Normal file
2
LANCommander/Snippets/Examples/Write to File.ps1
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Write contents of a string to a file
|
||||||
|
Set-Content "$InstallDir\<File Path>" "Hello world!"
|
30
LANCommander/Snippets/Functions/Get-AsciiBytes.ps1
Normal file
30
LANCommander/Snippets/Functions/Get-AsciiBytes.ps1
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
function Get-AsciiBytes([string]$InputString, [int]$MaxLength)
|
||||||
|
{
|
||||||
|
if ($InputString.Length -gt $MaxLength)
|
||||||
|
{
|
||||||
|
$InputString = $InputString.Substring(0, $MaxLength)
|
||||||
|
}
|
||||||
|
|
||||||
|
$bytes = [System.Text.Encoding]::ASCII.GetBytes($InputString)
|
||||||
|
$array = @()
|
||||||
|
$count = 0
|
||||||
|
|
||||||
|
$extraPadding = $MaxLength - $bytes.Length
|
||||||
|
|
||||||
|
foreach ($byte in $bytes)
|
||||||
|
{
|
||||||
|
if ($count -lt $MaxLength)
|
||||||
|
{
|
||||||
|
$array += $byte
|
||||||
|
$count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Pad the end with 0x00 to meet our max length
|
||||||
|
for ($i = $count; $i -lt $MaxLength; $i++)
|
||||||
|
{
|
||||||
|
$array += 0x00
|
||||||
|
}
|
||||||
|
|
||||||
|
return $array
|
||||||
|
}
|
11
LANCommander/Snippets/Functions/Patch-Binary.ps1
Normal file
11
LANCommander/Snippets/Functions/Patch-Binary.ps1
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
function Patch-Binary([byte[]]$Data, [int]$Offset, [string]$FilePath)
|
||||||
|
{
|
||||||
|
$bytes = [System.IO.File]::ReadAllBytes($FilePath)
|
||||||
|
|
||||||
|
for ($i = 0; $i -lt $Data.Length; $i++)
|
||||||
|
{
|
||||||
|
$bytes[$Offset + $i] = $Data[$i]
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.IO.File]::WriteAllBytes($FilePath, $bytes)
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
function Write-ReplaceContentInFile([string]$Regex, [string]$Replacement, [string]$FilePath)
|
||||||
|
{
|
||||||
|
$content = (Get-Content $FilePath) -replace $Regex, $Replacement
|
||||||
|
[IO.File]::WriteAllLines($FilePath, $content)
|
||||||
|
}
|
2
LANCommander/Snippets/Variables/Display.ps1
Normal file
2
LANCommander/Snippets/Variables/Display.ps1
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# Accessible via $Display.ScreenWidth and $Display.ScreenHeight
|
||||||
|
$Display = Get-WmiObject -Class Win32_DesktopMonitor | Select-Object ScreenWidth,ScreenHeight
|
1
LANCommander/Snippets/Variables/InstallDir.ps1
Normal file
1
LANCommander/Snippets/Variables/InstallDir.ps1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
$InstallDir = $PSScriptRoot
|
1
LANCommander/Snippets/Variables/NewName.ps1
Normal file
1
LANCommander/Snippets/Variables/NewName.ps1
Normal file
|
@ -0,0 +1 @@
|
||||||
|
$NewName = $args[0]
|
|
@ -1,4 +1,5 @@
|
||||||
@using LANCommander.Data.Enums
|
@using LANCommander.Components;
|
||||||
|
@using LANCommander.Data.Enums
|
||||||
@model LANCommander.Data.Models.Script
|
@model LANCommander.Data.Models.Script
|
||||||
|
|
||||||
@{
|
@{
|
||||||
|
@ -68,6 +69,12 @@
|
||||||
<input type="hidden" asp-for="GameId" />
|
<input type="hidden" asp-for="GameId" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col btn-list mb-3">
|
||||||
|
<component type="typeof(SnippetBar)" render-mode="Server" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="ScriptEditor" style="height: 100%; min-height: 600px;"></div>
|
<div id="ScriptEditor" style="height: 100%; min-height: 600px;"></div>
|
||||||
|
@ -90,9 +97,11 @@
|
||||||
<script src="~/lib/monaco-editor/min/vs/loader.js"></script>
|
<script src="~/lib/monaco-editor/min/vs/loader.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
window.Editor = {};
|
||||||
|
|
||||||
require.config({ paths: { vs: '/lib/monaco-editor/min/vs' } });
|
require.config({ paths: { vs: '/lib/monaco-editor/min/vs' } });
|
||||||
require(['vs/editor/editor.main'], function () {
|
require(['vs/editor/editor.main'], function () {
|
||||||
var editor = monaco.editor.create(document.getElementById('ScriptEditor'), {
|
window.Editor = monaco.editor.create(document.getElementById('ScriptEditor'), {
|
||||||
value: $('#Contents').val(),
|
value: $('#Contents').val(),
|
||||||
language: 'powershell',
|
language: 'powershell',
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
|
@ -100,7 +109,7 @@
|
||||||
automaticLayout: true
|
automaticLayout: true
|
||||||
});
|
});
|
||||||
|
|
||||||
editor.onDidChangeModelContent(function (e) {
|
window.Editor.onDidChangeModelContent(function (e) {
|
||||||
$('#Contents').val(editor.getModel().getValue());
|
$('#Contents').val(editor.getModel().getValue());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
@using LANCommander.Data.Enums
|
@using LANCommander.Components;
|
||||||
|
@using LANCommander.Data.Enums
|
||||||
@model LANCommander.Data.Models.Script
|
@model LANCommander.Data.Models.Script
|
||||||
|
|
||||||
@{
|
@{
|
||||||
|
@ -69,6 +70,12 @@
|
||||||
<input type="hidden" asp-for="Id" />
|
<input type="hidden" asp-for="Id" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col btn-list mb-3">
|
||||||
|
<component type="typeof(SnippetBar)" render-mode="Server" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="ScriptEditor" style="height: 100%; min-height: 600px;"></div>
|
<div id="ScriptEditor" style="height: 100%; min-height: 600px;"></div>
|
||||||
|
@ -91,9 +98,11 @@
|
||||||
<script src="~/lib/monaco-editor/min/vs/loader.js"></script>
|
<script src="~/lib/monaco-editor/min/vs/loader.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
window.Editor = {};
|
||||||
|
|
||||||
require.config({ paths: { vs: '/lib/monaco-editor/min/vs' } });
|
require.config({ paths: { vs: '/lib/monaco-editor/min/vs' } });
|
||||||
require(['vs/editor/editor.main'], function () {
|
require(['vs/editor/editor.main'], function () {
|
||||||
var editor = monaco.editor.create(document.getElementById('ScriptEditor'), {
|
window.Editor = monaco.editor.create(document.getElementById('ScriptEditor'), {
|
||||||
value: $('#Contents').val(),
|
value: $('#Contents').val(),
|
||||||
language: 'powershell',
|
language: 'powershell',
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
|
@ -101,7 +110,7 @@
|
||||||
automaticLayout: true
|
automaticLayout: true
|
||||||
});
|
});
|
||||||
|
|
||||||
editor.onDidChangeModelContent(function (e) {
|
window.Editor.onDidChangeModelContent(function (e) {
|
||||||
$('#Contents').val(editor.getModel().getValue());
|
$('#Contents').val(editor.getModel().getValue());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue