Skip to content

Commit

Permalink
Added UnknownXX response handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
SinoAHpx committed Jun 19, 2022
1 parent 6fb8ee6 commit 3e5bc75
Show file tree
Hide file tree
Showing 8 changed files with 182 additions and 53 deletions.
18 changes: 7 additions & 11 deletions Mirai.Net.Test/Program.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
using System;
using System.Linq;
using System.Net;
using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
using Manganese.Array;
using Manganese.Text;
using Mirai.Net.Data.Messages.Concretes;
using Mirai.Net.Data.Messages.Receivers;
using Mirai.Net.Data.Sessions;
Expand All @@ -24,7 +27,7 @@ private static async Task Main()
Address = new ConnectConfig
{
HttpAddress = new ConnectConfig.AdapterConfig("localhost", "8080"),
WebsocketAddress = new ConnectConfig.AdapterConfig("localhost", "1234")
WebsocketAddress = new ConnectConfig.AdapterConfig("localhost", "8080")
},
VerifyKey = "1145141919810",
QQ = "1590454991"
Expand All @@ -36,17 +39,10 @@ private static async Task Main()
.OfType<GroupMessageReceiver>()
.Subscribe(async r =>
{
if (r.MessageChain.GetPlainMessage() == "/send")
var ums = r.MessageChain.OfType<UnknownMessage>();
if (ums.Any())
{
var voice = new VoiceMessage
{
Path = "",
Url = "",
VoiceId = "",
Base64 = ""
};
await r.SendMessageAsync(voice);
ums.Output(x => x.ToJsonString());
}
});

Expand Down
31 changes: 31 additions & 0 deletions Mirai.Net/Data/Events/Concretes/UnknownEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Newtonsoft.Json;

namespace Mirai.Net.Data.Events.Concretes;

/// <summary>
/// 未知的事件
/// </summary>
public record UnknownEvent : EventBase
{
/// <summary>
/// 原json
/// </summary>
[JsonIgnore]
public string RawJson { get; set; }

/// <summary>
///
/// </summary>
public UnknownEvent()
{
}

/// <summary>
///
/// </summary>
/// <param name="rawJson"></param>
public UnknownEvent(string rawJson)
{
RawJson = rawJson;
}
}
31 changes: 31 additions & 0 deletions Mirai.Net/Data/Messages/Concretes/UnknownMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Newtonsoft.Json;

namespace Mirai.Net.Data.Messages.Concretes;

/// <summary>
/// 未知的(没有实现)的消息类型
/// </summary>
public record UnknownMessage : MessageBase
{
/// <summary>
/// 收到的json
/// </summary>
[JsonIgnore]
public string RawJson { get; set; }

/// <summary>
///
/// </summary>
/// <param name="rawJson"></param>
public UnknownMessage(string rawJson)
{
RawJson = rawJson;
}

/// <summary>
///
/// </summary>
public UnknownMessage()
{
}
}
31 changes: 31 additions & 0 deletions Mirai.Net/Data/Messages/Receivers/UnknownReceiver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Newtonsoft.Json;

namespace Mirai.Net.Data.Messages.Receivers;

/// <summary>
/// 未知类型的消息接收器
/// </summary>
public record UnknownReceiver : MessageReceiverBase
{
/// <summary>
/// 收到的json
/// </summary>
[JsonIgnore]
public string RawJson { get; set; }

/// <summary>
///
/// </summary>
public UnknownReceiver()
{
}

/// <summary>
///
/// </summary>
/// <param name="rawJson"></param>
public UnknownReceiver(string rawJson)
{
RawJson = rawJson;
}
}
2 changes: 1 addition & 1 deletion Mirai.Net/Mirai.Net.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
<PackageProjectUrl>https://github.com/SinoAHpx/Mirai.Net</PackageProjectUrl>
<PackageLicenseExpression>AGPL-3.0-only</PackageLicenseExpression>
<RepositoryUrl>https://github.com/SinoAHpx/Mirai.Net</RepositoryUrl>
<TargetFrameworks>net6.0;netstandard2.0</TargetFrameworks>
<PackageTags>Mirai, QQBot, mirai-api-http</PackageTags>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
Expand Down
8 changes: 4 additions & 4 deletions Mirai.Net/Sessions/MiraiBot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -213,16 +213,16 @@ private async Task StartWebsocketListenerAsync()
throw new InvalidWebsocketReponseException("Websocket传回错误响应");
}
RedirectWebSocketData(data);
ProcessWebSocketData(data);
});
}

private void RedirectWebSocketData(string data)
private void ProcessWebSocketData(string data)
{
var dataType = data.Fetch("type");
if (dataType == null || dataType.IsNullOrEmpty())
{
throw new InvalidWebsocketReponseException("Websocket传回错误响应");
throw new InvalidWebsocketReponseException("Websocket传回错误的响应");
}

if (dataType.Contains("Message"))
Expand All @@ -232,7 +232,7 @@ private void RedirectWebSocketData(string data)
var rawChain = data.Fetch("messageChain");
if (rawChain == null || rawChain.IsNullOrEmpty())
{
throw new InvalidResponseException("Websocket传回错误响应");
throw new InvalidResponseException("Websocket传回错误的响应");
}

receiver.MessageChain = rawChain
Expand Down
110 changes: 75 additions & 35 deletions Mirai.Net/Utils/Internal/ReflectionUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
using System.Reflection;
using Manganese.Text;
using Mirai.Net.Data.Events;
using Mirai.Net.Data.Events.Concretes;
using Mirai.Net.Data.Messages;
using Mirai.Net.Data.Messages.Concretes;
using Mirai.Net.Data.Messages.Receivers;
using Newtonsoft.Json;

namespace Mirai.Net.Utils.Internal;
Expand All @@ -25,7 +27,16 @@ internal static class ReflectionUtils
.Where(type => type.FullName != null)
.Where(type => type.FullName.Contains(@namespace))
.Where(type => !type.IsAbstract)
.Select(type => Activator.CreateInstance(type) as T);
.Select(type =>
{
if (Activator.CreateInstance(type) is T instance)
{
return instance;
}
return null;
})
.Where(i => i != null);
}

/// <summary>
Expand Down Expand Up @@ -54,40 +65,50 @@ internal static class ReflectionUtils
/// <returns></returns>
internal static MessageBase GetMessageBase(string data)
{
var root = JsonConvert.DeserializeObject<MessageBase>(data);

if (root!.Type == Messages.Quote)
try
{
var quote = JsonConvert.DeserializeObject<QuoteMessage>(data);
var raw = JsonConvert.DeserializeObject<MessageBase>(data);

quote!.Origin = data.FetchJToken("origin")!
.Select(x => GetMessageBase(x.ToString()))
.ToArray();
if (raw!.Type == Messages.Quote)
{
var quote = JsonConvert.DeserializeObject<QuoteMessage>(data);

quote!.Origin = data.FetchJToken("origin")!
.Select(x => GetMessageBase(x.ToString()))
.ToArray();

return quote;
}
return quote;
}

if (root!.Type == Messages.Forward)
{
var forward = JsonConvert.DeserializeObject<ForwardMessage>(data);
if (raw!.Type == Messages.Forward)
{
var forward = JsonConvert.DeserializeObject<ForwardMessage>(data);

forward!.NodeList = data.FetchJToken("nodeList")!
.Select(x =>
{
var node = x.ToObject<ForwardMessage.ForwardNode>();
node!.MessageChain = x.FetchJToken("messageChain")!.Select(z => GetMessageBase(z.ToString()))
.ToArray();
forward!.NodeList = data.FetchJToken("nodeList")!
.Select(x =>
{
var node = x.ToObject<ForwardMessage.ForwardNode>();
node!.MessageChain = x.FetchJToken("messageChain")!.Select(z => GetMessageBase(z.ToString()))
.ToArray();
return node;
})
.ToArray();
return node;
})
.ToArray();

return forward;
}
return forward;
}

return JsonConvert.DeserializeObject(data,
MessageBases.First(message => message.Type == root!.Type)
.GetType()) as MessageBase;
return JsonConvert.DeserializeObject(data,
MessageBases.First(message => message.Type == raw!.Type)
.GetType()) as MessageBase;
}
catch
{
var re = JsonConvert.DeserializeObject<UnknownMessage>(data);
re!.RawJson = data;
return re;
}

}

/// <summary>
Expand All @@ -97,11 +118,21 @@ internal static MessageBase GetMessageBase(string data)
/// <returns></returns>
internal static MessageReceiverBase GetMessageReceiverBase(string data)
{
var root = JsonConvert.DeserializeObject<MessageReceiverBase>(data);
try
{
var raw = JsonConvert.DeserializeObject<MessageReceiverBase>(data);

var type = MessageReceiverBases.First(receiver => receiver.Type == raw!.Type)
.GetType();

return JsonConvert.DeserializeObject(data,
MessageReceiverBases.First(receiver => receiver.Type == root!.Type)
.GetType()) as MessageReceiverBase;
return JsonConvert.DeserializeObject(data, type) as MessageReceiverBase;
}
catch
{
var re = JsonConvert.DeserializeObject<UnknownReceiver>(data);
re!.RawJson = data;
return re;
}
}

/// <summary>
Expand All @@ -111,10 +142,19 @@ internal static MessageReceiverBase GetMessageReceiverBase(string data)
/// <returns></returns>
internal static EventBase GetEventBase(string data)
{
var root = JsonConvert.DeserializeObject<EventBase>(data);
try
{
var raw = JsonConvert.DeserializeObject<EventBase>(data);

return JsonConvert.DeserializeObject(data,
EventBases.First(message => message.Type == root!.Type)
.GetType()) as EventBase;
return JsonConvert.DeserializeObject(data,
EventBases.First(message => message.Type == raw!.Type)
.GetType()) as EventBase;
}
catch
{
var re = JsonConvert.DeserializeObject<UnknownEvent>(data);
re!.RawJson = data;
return re;
}
}
}
4 changes: 2 additions & 2 deletions Mirai.Net/Utils/Scaffolds/MessageChainBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,15 @@ public MessageChainBuilder App(string content)
});
return this;
}

/// <summary>
/// 追加一套at全体成员消息
/// </summary>
/// <returns></returns>
public MessageChainBuilder AtAll()
{
_chain.Add(new AtAllMessage());

return this;
}

Expand Down

0 comments on commit 3e5bc75

Please sign in to comment.