Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 84 additions & 51 deletions src/MaaFramework.Binding.Extensions/Notification/NotificationDetail.cs
Original file line number Diff line number Diff line change
@@ -1,51 +1,84 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace MaaFramework.Binding.Notification;

/// <inheritdoc cref="MaaMsg.Resource.Loading.Prefix"/>
public record ResourceLoadingDetail(
[property: JsonPropertyName("res_id")] int ResourceId,
[property: JsonPropertyName("hash")] string Hash,
[property: JsonPropertyName("path")] string Path
);

/// <inheritdoc cref="MaaMsg.Controller.Action.Prefix"/>
public record ControllerActionDetail(
[property: JsonPropertyName("ctrl_id")] int ControllerId,
[property: JsonPropertyName("uuid")] string Uuid,
[property: JsonPropertyName("action")] string Action,
[property: JsonPropertyName("param")] JsonElement Param
);

/// <inheritdoc cref="MaaMsg.Tasker.Task.Prefix"/>
public record TaskerTaskDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("entry")] string Entry,
[property: JsonPropertyName("uuid")] string Uuid,
[property: JsonPropertyName("hash")] string Hash
);

/// <inheritdoc cref="MaaMsg.Node.NextList.Prefix"/>
public record NodeNextListDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("list")] IReadOnlyList<string> NextList,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <inheritdoc cref="MaaMsg.Node.Recognition.Prefix"/>
public record NodeRecognitionDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("reco_id")] int RecognitionId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <inheritdoc cref="MaaMsg.Node.Action.Prefix"/>
public record NodeActionDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("action_id")] int ActionId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);
using System.Text.Json;
using System.Text.Json.Serialization;

namespace MaaFramework.Binding.Notification;

/// <inheritdoc cref="MaaMsg.Resource.Loading.Prefix"/>
public record ResourceLoadingDetail(
[property: JsonPropertyName("res_id")] int ResourceId,
[property: JsonPropertyName("hash")] string Hash,
[property: JsonPropertyName("path")] string Path
);

/// <inheritdoc cref="MaaMsg.Controller.Action.Prefix"/>
public record ControllerActionDetail(
[property: JsonPropertyName("ctrl_id")] int ControllerId,
[property: JsonPropertyName("uuid")] string Uuid,
[property: JsonPropertyName("action")] string Action,
[property: JsonPropertyName("param")] JsonElement Param
);

/// <inheritdoc cref="MaaMsg.Tasker.Task.Prefix"/>
public record TaskerTaskDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("entry")] string Entry,
[property: JsonPropertyName("uuid")] string Uuid,
[property: JsonPropertyName("hash")] string Hash
);

/// <inheritdoc cref="MaaMsg.Node.PipelineNode.Prefix"/>
public record NodePipelineNodeDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("node_id")] int NodeId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <inheritdoc cref="MaaMsg.Node.RecognitionNode.Prefix"/>
public record NodeRecognitionNodeDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("node_id")] int NodeId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <inheritdoc cref="MaaMsg.Node.ActionNode.Prefix"/>
public record NodeActionNodeDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("node_id")] int NodeId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <summary>
/// Represents an item in the next list.
/// </summary>
public record NodeAttr(
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("jump_back")] bool JumpBack,
[property: JsonPropertyName("anchor")] bool Anchor
);

/// <inheritdoc cref="MaaMsg.Node.NextList.Prefix"/>
public record NodeNextListDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("list")] IReadOnlyList<NodeAttr> NextList,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <inheritdoc cref="MaaMsg.Node.Recognition.Prefix"/>
public record NodeRecognitionDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("reco_id")] int RecognitionId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);

/// <inheritdoc cref="MaaMsg.Node.Action.Prefix"/>
public record NodeActionDetail(
[property: JsonPropertyName("task_id")] int TaskId,
[property: JsonPropertyName("action_id")] int ActionId,
[property: JsonPropertyName("name")] string Name,
[property: JsonPropertyName("focus")] JsonElement? Focus
);
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using System.Text.Json.Serialization;

namespace MaaFramework.Binding.Notification;

/// <inheritdoc cref="JsonSerializerContext"/>
[JsonSerializable(typeof(ResourceLoadingDetail))]
[JsonSerializable(typeof(ControllerActionDetail))]
[JsonSerializable(typeof(TaskerTaskDetail))]
[JsonSerializable(typeof(NodeNextListDetail))]
[JsonSerializable(typeof(NodeRecognitionDetail))]
[JsonSerializable(typeof(NodeActionDetail))]
public partial class NotificationDetailContext : JsonSerializerContext;
using System.Text.Json.Serialization;

namespace MaaFramework.Binding.Notification;

/// <inheritdoc cref="JsonSerializerContext"/>
[JsonSerializable(typeof(ResourceLoadingDetail))]
[JsonSerializable(typeof(ControllerActionDetail))]
[JsonSerializable(typeof(TaskerTaskDetail))]
[JsonSerializable(typeof(NodePipelineNodeDetail))]
[JsonSerializable(typeof(NodeRecognitionNodeDetail))]
[JsonSerializable(typeof(NodeActionNodeDetail))]
[JsonSerializable(typeof(NodeAttr))]
[JsonSerializable(typeof(NodeNextListDetail))]
[JsonSerializable(typeof(NodeRecognitionDetail))]
[JsonSerializable(typeof(NodeActionDetail))]
public partial class NotificationDetailContext : JsonSerializerContext;
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ public static class NotificationHandlerExtensions
{
MaaMsg.Resource.Loading.Starting
or MaaMsg.Controller.Action.Starting
or MaaMsg.Node.PipelineNode.Starting
or MaaMsg.Node.RecognitionNode.Starting
or MaaMsg.Node.ActionNode.Starting
or MaaMsg.Node.Action.Starting
or MaaMsg.Node.NextList.Starting
or MaaMsg.Node.Recognition.Starting
Expand All @@ -29,6 +32,9 @@ or MaaMsg.Tasker.Task.Starting

MaaMsg.Resource.Loading.Succeeded
or MaaMsg.Controller.Action.Succeeded
or MaaMsg.Node.PipelineNode.Succeeded
or MaaMsg.Node.RecognitionNode.Succeeded
or MaaMsg.Node.ActionNode.Succeeded
or MaaMsg.Node.Action.Succeeded
or MaaMsg.Node.NextList.Succeeded
or MaaMsg.Node.Recognition.Succeeded
Expand All @@ -37,6 +43,9 @@ or MaaMsg.Tasker.Task.Succeeded

MaaMsg.Resource.Loading.Failed
or MaaMsg.Controller.Action.Failed
or MaaMsg.Node.PipelineNode.Failed
or MaaMsg.Node.RecognitionNode.Failed
or MaaMsg.Node.ActionNode.Failed
or MaaMsg.Node.Action.Failed
or MaaMsg.Node.NextList.Failed
or MaaMsg.Node.Recognition.Failed
Expand Down Expand Up @@ -102,5 +111,17 @@ public static EventHandler<MaaCallbackEventArgs> ToCallback(this NotificationHan
/// <inheritdoc cref="ToCallback{TDetail, TContext}"/>
public static EventHandler<MaaCallbackEventArgs> ToCallback(this NotificationHandler<NodeActionDetail, IMaaContext> notify)
=> notify.ToCallback(MaaMsg.Node.Action.Prefix);

/// <inheritdoc cref="ToCallback{TDetail, TContext}"/>
public static EventHandler<MaaCallbackEventArgs> ToCallback(this NotificationHandler<NodePipelineNodeDetail, IMaaContext> notify)
=> notify.ToCallback(MaaMsg.Node.PipelineNode.Prefix);

/// <inheritdoc cref="ToCallback{TDetail, TContext}"/>
public static EventHandler<MaaCallbackEventArgs> ToCallback(this NotificationHandler<NodeRecognitionNodeDetail, IMaaContext> notify)
=> notify.ToCallback(MaaMsg.Node.RecognitionNode.Prefix);

/// <inheritdoc cref="ToCallback{TDetail, TContext}"/>
public static EventHandler<MaaCallbackEventArgs> ToCallback(this NotificationHandler<NodeActionNodeDetail, IMaaContext> notify)
=> notify.ToCallback(MaaMsg.Node.ActionNode.Prefix);
}

Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,24 @@ public void OnCallback(object? sender, MaaCallbackEventArgs e)
Tasker.Task.OnSucceeded(sender, e.Details); return;
case MaaMsg.Tasker.Task.Failed:
Tasker.Task.OnFailed(sender, e.Details); return;
case MaaMsg.Node.PipelineNode.Starting:
Node.PipelineNode.OnStarting(sender, e.Details); return;
case MaaMsg.Node.PipelineNode.Succeeded:
Node.PipelineNode.OnSucceeded(sender, e.Details); return;
case MaaMsg.Node.PipelineNode.Failed:
Node.PipelineNode.OnFailed(sender, e.Details); return;
case MaaMsg.Node.RecognitionNode.Starting:
Node.RecognitionNode.OnStarting(sender, e.Details); return;
case MaaMsg.Node.RecognitionNode.Succeeded:
Node.RecognitionNode.OnSucceeded(sender, e.Details); return;
case MaaMsg.Node.RecognitionNode.Failed:
Node.RecognitionNode.OnFailed(sender, e.Details); return;
case MaaMsg.Node.ActionNode.Starting:
Node.ActionNode.OnStarting(sender, e.Details); return;
case MaaMsg.Node.ActionNode.Succeeded:
Node.ActionNode.OnSucceeded(sender, e.Details); return;
case MaaMsg.Node.ActionNode.Failed:
Node.ActionNode.OnFailed(sender, e.Details); return;
case MaaMsg.Node.NextList.Starting:
Node.NextList.OnStarting(sender, e.Details); return;
case MaaMsg.Node.NextList.Succeeded:
Expand Down Expand Up @@ -130,6 +148,48 @@ internal void OnFailed(object? sender, string details) => Failed?.Invoke(sender,
public NodeRegistry Node { get; } = new();
public sealed class NodeRegistry
{
public PipelineNodeRegistry PipelineNode { get; } = new();
public sealed class PipelineNodeRegistry
{
public event EventHandler<NodePipelineNodeDetail>? Starting;
internal void OnStarting(object? sender, string details) => Starting?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodePipelineNodeDetail) ?? throw new InvalidCastException());
public event EventHandler<NodePipelineNodeDetail>? Succeeded;
internal void OnSucceeded(object? sender, string details) => Succeeded?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodePipelineNodeDetail) ?? throw new InvalidCastException());
public event EventHandler<NodePipelineNodeDetail>? Failed;
internal void OnFailed(object? sender, string details) => Failed?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodePipelineNodeDetail) ?? throw new InvalidCastException());
}

public RecognitionNodeRegistry RecognitionNode { get; } = new();
public sealed class RecognitionNodeRegistry
{
public event EventHandler<NodeRecognitionNodeDetail>? Starting;
internal void OnStarting(object? sender, string details) => Starting?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodeRecognitionNodeDetail) ?? throw new InvalidCastException());
public event EventHandler<NodeRecognitionNodeDetail>? Succeeded;
internal void OnSucceeded(object? sender, string details) => Succeeded?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodeRecognitionNodeDetail) ?? throw new InvalidCastException());
public event EventHandler<NodeRecognitionNodeDetail>? Failed;
internal void OnFailed(object? sender, string details) => Failed?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodeRecognitionNodeDetail) ?? throw new InvalidCastException());
}

public ActionNodeRegistry ActionNode { get; } = new();
public sealed class ActionNodeRegistry
{
public event EventHandler<NodeActionNodeDetail>? Starting;
internal void OnStarting(object? sender, string details) => Starting?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodeActionNodeDetail) ?? throw new InvalidCastException());
public event EventHandler<NodeActionNodeDetail>? Succeeded;
internal void OnSucceeded(object? sender, string details) => Succeeded?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodeActionNodeDetail) ?? throw new InvalidCastException());
public event EventHandler<NodeActionNodeDetail>? Failed;
internal void OnFailed(object? sender, string details) => Failed?.Invoke(sender, JsonSerializer.Deserialize(details,
NotificationDetailContext.Default.NodeActionNodeDetail) ?? throw new InvalidCastException());
}

public NextListRegistry NextList { get; } = new();
public sealed class NextListRegistry
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ public static partial class MaaAgentClient
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaAgentClientSetTimeout(MaaAgentClientHandle client, long milliseconds);

[LibraryImport("MaaAgentClient", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaAgentClientGetCustomRecognitionList(MaaAgentClientHandle client, MaaStringListBufferHandle buffer);

[LibraryImport("MaaAgentClient", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaAgentClientGetCustomActionList(MaaAgentClientHandle client, MaaStringListBufferHandle buffer);

[Obsolete]
[LibraryImport("MaaAgentClient", StringMarshalling = StringMarshalling.Utf8)]
public static partial MaaAgentClientHandle MaaAgentClientCreate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,20 @@ public static partial class MaaContext

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
public static partial MaaContextHandle MaaContextClone(MaaContextHandle context);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaContextSetAnchor(MaaContextHandle context, string anchorName, string nodeName);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaContextGetAnchor(MaaContextHandle context, string anchorName, MaaStringBufferHandle buffer);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaContextGetHitCount(MaaContextHandle context, string nodeName, out MaaSize count);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaContextClearHitCount(MaaContextHandle context, string nodeName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ public static partial class MaaController
[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
public static partial MaaCtrlId MaaControllerPostScreencap(MaaControllerHandle ctrl);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
public static partial MaaCtrlId MaaControllerPostScroll(MaaControllerHandle ctrl, int dx, int dy);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
public static partial MaaStatus MaaControllerStatus(MaaControllerHandle ctrl, MaaCtrlId id);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ private sealed class Delegates(IMaaCustomController managed)
public InputTextDelegate InputText = (string text, nint transArg) => managed.InputText(text);
public KeyDownDelegate KeyDown = (int keycode, nint transArg) => managed.KeyDown(keycode);
public KeyUpDelegate KeyUp = (int keycode, nint transArg) => managed.KeyUp(keycode);
public ScrollDelegate Scroll = (int dx, int dy, nint transArg) => managed.Scroll(dx, dy);
};

/// <summary>
Expand Down Expand Up @@ -135,6 +136,7 @@ private sealed class Unmanaged(Delegates delegates)
public nint InputText = Marshal.GetFunctionPointerForDelegate(delegates.InputText);
public nint KeyDown = Marshal.GetFunctionPointerForDelegate(delegates.KeyDown);
public nint KeyUp = Marshal.GetFunctionPointerForDelegate(delegates.KeyUp);
public nint Scroll = Marshal.GetFunctionPointerForDelegate(delegates.Scroll);
}

[return: MarshalAs(UnmanagedType.U1)]
Expand Down Expand Up @@ -201,4 +203,8 @@ private sealed class Unmanaged(Delegates delegates)
[return: MarshalAs(UnmanagedType.U1)]
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate bool KeyUpDelegate(int keycode, nint transArg);

[return: MarshalAs(UnmanagedType.U1)]
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate bool ScrollDelegate(int dx, int dy, nint transArg);
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,12 @@ public static partial class MaaResource
[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaResourceGetNodeList(MaaResourceHandle res, MaaStringListBufferHandle buffer);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaResourceGetCustomRecognitionList(MaaResourceHandle res, MaaStringListBufferHandle buffer);

[LibraryImport("MaaFramework", StringMarshalling = StringMarshalling.Utf8)]
[return: MarshalAs(UnmanagedType.U1)]
public static partial bool MaaResourceGetCustomActionList(MaaResourceHandle res, MaaStringListBufferHandle buffer);
}
Loading
Loading