1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
using ArcaneLibs.StringNormalisation;
using LibMatrix.EventTypes.Spec;
using LibMatrix.ExampleBot.Bot.Interfaces;
namespace LibMatrix.ExampleBot.Bot.Commands;
public class CmdCommand : ICommand {
public string Name => "cmd";
public string Description => "Runs a command on the host system";
public Task<bool> CanInvoke(CommandContext ctx) {
return Task.FromResult(ctx.MessageEvent.Sender.EndsWith(":rory.gay") || ctx.MessageEvent.Sender.EndsWith(":conduit.rory.gay"));
}
public async Task Invoke(CommandContext ctx) {
var cmd = ctx.Args.Aggregate("\"", (current, arg) => current + arg + " ");
cmd = cmd.Trim();
cmd += "\"";
await ctx.Room.SendMessageEventAsync(new RoomMessageEventContent(body: $"Command being executed: `{cmd}`"));
var output = ArcaneLibs.Util.GetCommandOutputAsync(
Environment.OSVersion.Platform == PlatformID.Unix ? "/bin/sh" : "cmd.exe",
(Environment.OSVersion.Platform == PlatformID.Unix ? "-c " : "/c ") + cmd);
// .Replace("`", "\\`")
// .Split("\n").ToList();
var msg = "";
EventIdResponse? msgId = await ctx.Room.SendMessageEventAsync(new RoomMessageEventContent {
FormattedBody = $"Waiting for command output...",
Body = msg.RemoveAnsi(),
Format = "m.notice"
});
var lastSendTask = Task.CompletedTask;
await foreach (var @out in output) {
Console.WriteLine($"{@out.Length:0000} {@out}");
msg += @out + "\n";
if (lastSendTask.IsCompleted)
lastSendTask = ctx.Room.SendMessageEventAsync(new RoomMessageEventContent {
FormattedBody = $"<pre class=\"language-csharp\">\n{msg}\n</pre>",
Body = msg.RemoveAnsi(),
Format = "org.matrix.custom.html"
});
if (msg.Length > 31000) {
await lastSendTask;
msgId = await ctx.Room.SendMessageEventAsync(new RoomMessageEventContent {
FormattedBody = $"Waiting for command output...",
Body = msg.RemoveAnsi(),
Format = "m.notice"
});
msg = "";
}
}
// while (output.Count > 0) {
// Console.WriteLine("Adding: " + output[0]);
// msg += output[0] + "\n";
// output.RemoveAt(0);
// if ((output.Count > 0 && (msg + output[0]).Length > 31500) || output.Count == 0) {
// await ctx.Room.SendMessageEventAsync("m.room.message", new RoomMessageEventContent {
// FormattedBody = $"<pre class=\"language-csharp\">\n{msg}\n</pre>",
// // Body = Markdig.Markdown.ToHtml(msg),
// Body = msg.RemoveAnsi(),
// Format = "org.matrix.custom.html"
// });
// msg = "";
// }
// }
}
}
|