03/14 Last Update

This commit is contained in:
悠静萝莉
2021-03-14 20:27:46 +08:00
parent de4fe14d74
commit f6c1e9f115
11 changed files with 479 additions and 329 deletions

3
.gitignore vendored
View File

@@ -340,4 +340,5 @@ ASALocalRun/
healthchecksdb
DevIcon.*
Test
nuget.config
nuget.config
*.cd

View File

@@ -62,15 +62,15 @@ namespace AuroraNative
/// <summary>
/// 发送私聊消息
/// </summary>
/// <param name="QID">接受者QQ号</param>
/// <param name="UserID">接受者QQ号</param>
/// <param name="Message">信息内容</param>
/// <param name="AutoEscape">是否转义<para>默认false</para></param>
/// <returns>返回消息ID错误返回-1</returns>
public async Task<string> SendPrivateMessage(long QID, string Message, bool AutoEscape = false)
public async Task<string> SendPrivateMessage(long UserID, string Message, bool AutoEscape = false)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "message", Message },
{ "auto_escape", AutoEscape }
};
@@ -119,11 +119,11 @@ namespace AuroraNative
/// </summary>
/// <param name="Message">信息内容</param>
/// <param name="MessageType">信息类型<para>私聊private</para><para>群聊group</para></param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="GroupID">群号</param>
/// <param name="AutoEscape">是否转义<para>默认false</para></param>
/// <returns>错误返回-1成功返回信息ID</returns>
public async Task<string> SendMsg(string Message, string MessageType = null, long QID = 0, long GroupID = 0, bool AutoEscape = false)
public async Task<string> SendMsg(string Message, string MessageType = null, long UserID = 0, long GroupID = 0, bool AutoEscape = false)
{
JObject Params = new JObject() {
{ "message", Message},
@@ -133,15 +133,15 @@ namespace AuroraNative
switch (MessageType)
{
case "private":
Params.Add("user_id", QID);
Params.Add("user_id", UserID);
break;
case "group":
Params.Add("group_id", GroupID);
break;
case null:
if (QID != 0)
if (UserID != 0)
{
Params.Add("user_id", QID);
Params.Add("user_id", UserID);
}
else if (GroupID != 0)
{
@@ -199,26 +199,33 @@ namespace AuroraNative
/// </summary>
/// <param name="Filename">图片缓存文件名,带不带后缀你喜欢就好</param>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetImage(string Filename)
public async Task<Dictionary<string, object>> GetImage(string Filename)
{
if (!Filename.Contains(".image"))
{
Filename += ".image";
}
return await SendCallObject(new BaseAPI("get_image", new JObject() { { "file", Filename } }, "GetImage:" + Utils.NowTimeSteamp()));
JObject Json = await SendCallObject(new BaseAPI("get_image", new JObject() { { "file", Filename } }, "GetImage:" + Utils.NowTimeSteamp()));
return new Dictionary<string, object>() {
{"Size",Json.Value<int>("size")},
{"FileName",Json.Value<string>("filename")},
{"Url",Json.Value<string>("url")}
};
}
/// <summary>
/// 群组踢人
/// </summary>
/// <param name="GroupID">群号</param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="RejectAddRequest">是否自动拒绝此人加群申请<para>默认:false</para></param>
public void SetGroupKick(long GroupID, long QID, bool RejectAddRequest = false)
public void SetGroupKick(long GroupID, long UserID, bool RejectAddRequest = false)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "group_id", GroupID },
{ "reject_add_request", RejectAddRequest }
};
@@ -230,13 +237,13 @@ namespace AuroraNative
/// 群组单人禁言
/// </summary>
/// <param name="GroupID">群号</param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="Duration">禁言时间,单位秒<para>默认:30分钟(1800秒)</para></param>
public void SetGroupBan(long GroupID, long QID, int Duration = 1800)
public void SetGroupBan(long GroupID, long UserID, int Duration = 1800)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "group_id", GroupID },
{ "duration", Duration }
};
@@ -291,13 +298,13 @@ namespace AuroraNative
/// 设置群管理员
/// </summary>
/// <param name="GroupID">群号</param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="Enable">是否设置为管理员<para>默认:true</para></param>
public void SetGroupAdmin(long GroupID, long QID, bool Enable = true)
public void SetGroupAdmin(long GroupID, long UserID, bool Enable = true)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "group_id", GroupID },
{ "enable", Enable }
};
@@ -309,13 +316,13 @@ namespace AuroraNative
/// 设置群名片
/// </summary>
/// <param name="GroupID">群号</param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="Card">群名片内容<para>默认:null删除群名片</para></param>
public void SetGroupCard(long GroupID, long QID, string Card = null)
public void SetGroupCard(long GroupID, long UserID, string Card = null)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "group_id", GroupID },
{ "card", Card }
};
@@ -359,14 +366,14 @@ namespace AuroraNative
/// 设置群组专属头衔
/// </summary>
/// <param name="GroupID">群号</param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="SpecialTitle">群名片内容<para>默认:null删除群名片</para></param>
/// <param name="Duration">专属头衔有效期, 单位秒, 不过此项似乎没有效果, 可能是只有某些特殊的时间长度有效, 有待测试<para>默认:-1(永久)</para></param>
public void SetGroupSpecialTitle(long GroupID, long QID, string SpecialTitle = null, int Duration = -1)
public void SetGroupSpecialTitle(long GroupID, long UserID, string SpecialTitle = null, int Duration = -1)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "group_id", GroupID },
{ "duration", Duration },
{ "special_title", SpecialTitle }
@@ -417,35 +424,48 @@ namespace AuroraNative
/// 获取登录号信息
/// </summary>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetLoginInfo()
public async Task<Dictionary<string, object>> GetLoginInfo()
{
return await SendCallObject(new BaseAPI("get_login_info", null, "GetLoginInfo:" + Utils.NowTimeSteamp()));
JObject Json = await SendCallObject(new BaseAPI("get_login_info", null, "GetLoginInfo:" + Utils.NowTimeSteamp()));
return new Dictionary<string, object>() {
{"UserID",Json.Value<long>("user_id")},
{"NickName",Json.Value<string>("nickname")}
};
}
/// <summary>
/// 获取陌生人信息
/// </summary>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="Cache">是否使用缓存,使用缓存响应快但是可能更新不及时<para>默认:false</para></param>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetStrangerInfo(long QID, bool Cache = false)
public async Task<Dictionary<string, object>> GetStrangerInfo(long UserID, bool Cache = false)
{
JObject Params = new JObject
{
{ "user_id", QID },
{ "user_id", UserID },
{ "no_cache ", Cache }
};
return await SendCallObject(new BaseAPI("get_stranger_info", Params, "GetStrangerInfo:" + Utils.NowTimeSteamp()));
JObject Json = await SendCallObject(new BaseAPI("get_stranger_info", Params, "GetStrangerInfo:" + Utils.NowTimeSteamp()));
return new Dictionary<string, object>() {
{"UserID",Json.Value<int>("user_id")},
{"NickName",Json.Value<string>("nickname")},
{"Sex",Json.Value<string>("sex")},
{"Age",Json.Value<string>("age")},
{"QID",Json.Value<string>("qid")}
};
}
/// <summary>
/// 获取好友列表
/// </summary>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetFriendList()
public async Task<List<Friends>> GetFriendList()
{
return await SendCallObject(new BaseAPI("get_friend_list", null, "GetFriendList:" + Utils.NowTimeSteamp()));
return (await SendCallArray(new BaseAPI("get_friend_list", null, "GetFriendList:" + Utils.NowTimeSteamp()))).ToObject<List<Friends>>();
}
/// <summary>
@@ -478,15 +498,15 @@ namespace AuroraNative
/// 获取群成员信息
/// </summary>
/// <param name="GroupID">群号</param>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <param name="Cache">是否使用缓存,使用缓存响应快但是可能更新不及时<para>默认:false</para></param>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetGroupMemberInfo(long GroupID, long QID, bool Cache = false)
public async Task<JObject> GetGroupMemberInfo(long GroupID, long UserID, bool Cache = false)
{
JObject Params = new JObject
{
{ "group_id", GroupID },
{ "user_id", QID },
{ "user_id", UserID },
{ "no_cache ", Cache }
};
@@ -542,9 +562,26 @@ namespace AuroraNative
/// 获取版本信息
/// </summary>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetVersionInfo()
public async Task<Dictionary<string, object>> GetVersionInfo()
{
return await SendCallObject(new BaseAPI("get_version_info", null, "GetVersionInfo:" + Utils.NowTimeSteamp()));
JObject Json = await SendCallObject(new BaseAPI("get_version_info", null, "GetVersionInfo:" + Utils.NowTimeSteamp()));
return new Dictionary<string, object>() {
{"AppFullName",Json.Value<string>("app_full_name")},
{"AppName",Json.Value<string>("app_name")},
{"AppVersion",Json.Value<string>("app_version")},
{"CQDirectory",Json.Value<string>("coolq_directory")},
{"CQEdition",Json.Value<string>("coolq_edition")},
{"IsGoCqhttp",Json.Value<bool>("go-cqhttp")},
{"PluginBuildConfiguration",Json.Value<string>("plugin_build_configuration")},
{"PluginBuildNumber",Json.Value<string>("plugin_build_number")},
{"PluginVersion",Json.Value<string>("plugin_version")},
{"Protocol",Json.Value<string>("protocol")},
{"ProtocolVersion",Json.Value<string>("protocol_version")},
{"RuntimeOS",Json.Value<string>("runtime_os")},
{"RuntimeVersion",Json.Value<string>("runtime_version")},
{"Version",Json.Value<string>("version")}
};
}
/// <summary>
@@ -717,11 +754,11 @@ namespace AuroraNative
/// <summary>
/// 获取VIP信息
/// </summary>
/// <param name="QID">QQ号</param>
/// <param name="UserID">QQ号</param>
/// <returns>错误返回null,成功返回JObject</returns>
public async Task<JObject> GetVIPInfo(long QID)
public async Task<JObject> GetVIPInfo(long UserID)
{
return await SendCallObject(new BaseAPI("_get_vip_info", new JObject { { "user_id", QID } }, "GetGroupAtAllRemain:" + Utils.NowTimeSteamp()));
return await SendCallObject(new BaseAPI("_get_vip_info", new JObject { { "user_id", UserID } }, "GetGroupAtAllRemain:" + Utils.NowTimeSteamp()));
}
/// <summary>
@@ -840,8 +877,7 @@ namespace AuroraNative
private async Task<string> SendCallMessageID(BaseAPI Params)
{
WebSocket.Send(Params);
TaskList.Add(Params.UniqueCode, "Sended");
SendCall(Params);
string Result = "-1";
await Task.Run(() => { Result = FeedbackMessageID(Params.UniqueCode); });
@@ -850,14 +886,32 @@ namespace AuroraNative
private async Task<JObject> SendCallObject(BaseAPI Params)
{
WebSocket.Send(Params);
TaskList.Add(Params.UniqueCode, "Sended");
SendCall(Params);
JObject Result = null;
await Task.Run(() => { Result = FeedbackObject(Params.UniqueCode); });
return Result;
}
private async Task<JArray> SendCallArray(BaseAPI Params)
{
SendCall(Params);
JArray Result = null;
await Task.Run(() => { Result = FeedbackArray(Params.UniqueCode); });
return Result;
}
private void SendCall(BaseAPI Params)
{
Logger.Debug($"API调用:\n请求的接口:{Params.Action}\n请求的唯一码:{Params.UniqueCode}\n请求的参数:\n{Params.Params}");
WebSocket.Send(Params);
if (!TaskList.TryGetValue(Params.UniqueCode, out _))
{
TaskList.Add(Params.UniqueCode, "Sended");
}
}
private void SendCallVoid(BaseAPI Params)
{
WebSocket.Send(Params);
@@ -889,6 +943,18 @@ namespace AuroraNative
return null;
}
private static JArray FeedbackArray(string UniqueCode)
{
JObject FBJson = GetFeedback(UniqueCode);
//判断返回
if (FBJson["status"].ToString() == "ok")
{
return JArray.Parse(FBJson["data"].ToString());
}
return null;
}
private static JObject GetFeedback(string UniqueCode)
{
JObject FBJson = new JObject();
@@ -912,6 +978,14 @@ namespace AuroraNative
{
Api api = new Api(WebSocket);
Cache.Set($"API{AppDomain.CurrentDomain.Id}", api);
Task.Run(() =>
{
Thread.Sleep(5000);
if (!BaseWebSocket.IsCheckVersion)
{
Event.CheckVersion();
}
});
return api;
}
catch (WebSocketException e)

View File

@@ -0,0 +1,32 @@
using Newtonsoft.Json;
namespace AuroraNative
{
/// <summary>
/// 好友 抽象类
/// </summary>
public sealed class Friends
{
#region ----
/// <summary>
/// QQ号
/// </summary>
[JsonProperty(PropertyName = "user_id")]
public long UserID;
/// <summary>
/// 昵称
/// </summary>
[JsonProperty(PropertyName = "nickname")]
public string NickName;
/// <summary>
/// 备注
/// </summary>
[JsonProperty(PropertyName = "remark")]
public string Remark;
#endregion
}
}

View File

@@ -4,6 +4,26 @@
<name>AuroraNative</name>
</assembly>
<members>
<member name="T:AuroraNative.Friends">
<summary>
好友 抽象类
</summary>
</member>
<member name="F:AuroraNative.Friends.UserID">
<summary>
QQ号
</summary>
</member>
<member name="F:AuroraNative.Friends.NickName">
<summary>
昵称
</summary>
</member>
<member name="F:AuroraNative.Friends.Remark">
<summary>
备注
</summary>
</member>
<member name="T:AuroraNative.Api">
<summary>
API 类
@@ -29,7 +49,7 @@
<summary>
发送私聊消息
</summary>
<param name="QID">接受者QQ号</param>
<param name="UserID">接受者QQ号</param>
<param name="Message">信息内容</param>
<param name="AutoEscape">是否转义<para>默认false</para></param>
<returns>返回消息ID错误返回-1</returns>
@@ -43,7 +63,7 @@
<param name="AutoEscape">是否转义<para>默认false</para></param>
<returns>返回消息ID错误返回-1</returns>
</member>
<member name="M:AuroraNative.Api.SendGroupForwardMessage(System.Int64,System.Object)">
<member name="M:AuroraNative.Api.SendGroupForwardMessage(System.Int64,Newtonsoft.Json.Linq.JArray)">
<summary>
转发合并消息 - 群
</summary>
@@ -57,7 +77,7 @@
</summary>
<param name="Message">信息内容</param>
<param name="MessageType">信息类型<para>私聊private</para><para>群聊group</para></param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="GroupID">群号</param>
<param name="AutoEscape">是否转义<para>默认false</para></param>
<returns>错误返回-1成功返回信息ID</returns>
@@ -94,7 +114,7 @@
群组踢人
</summary>
<param name="GroupID">群号</param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="RejectAddRequest">是否自动拒绝此人加群申请<para>默认:false</para></param>
</member>
<member name="M:AuroraNative.Api.SetGroupBan(System.Int64,System.Int64,System.Int32)">
@@ -102,7 +122,7 @@
群组单人禁言
</summary>
<param name="GroupID">群号</param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="Duration">禁言时间,单位秒<para>默认:30分钟(1800秒)</para></param>
</member>
<member name="M:AuroraNative.Api.SetGroupAnonymousBan(System.Int64,System.Int32,System.String,AuroraNative.EventArgs.Anonymous)">
@@ -126,7 +146,7 @@
设置群管理员
</summary>
<param name="GroupID">群号</param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="Enable">是否设置为管理员<para>默认:true</para></param>
</member>
<member name="M:AuroraNative.Api.SetGroupCard(System.Int64,System.Int64,System.String)">
@@ -134,7 +154,7 @@
设置群名片
</summary>
<param name="GroupID">群号</param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="Card">群名片内容<para>默认:null删除群名片</para></param>
</member>
<member name="M:AuroraNative.Api.SetGroupName(System.Int64,System.String)">
@@ -156,7 +176,7 @@
设置群组专属头衔
</summary>
<param name="GroupID">群号</param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="SpecialTitle">群名片内容<para>默认:null删除群名片</para></param>
<param name="Duration">专属头衔有效期, 单位秒, 不过此项似乎没有效果, 可能是只有某些特殊的时间长度有效, 有待测试<para>默认:-1(永久)</para></param>
</member>
@@ -187,7 +207,7 @@
<summary>
获取陌生人信息
</summary>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="Cache">是否使用缓存,使用缓存响应快但是可能更新不及时<para>默认:false</para></param>
<returns>错误返回null,成功返回JObject</returns>
</member>
@@ -216,7 +236,7 @@
获取群成员信息
</summary>
<param name="GroupID">群号</param>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<param name="Cache">是否使用缓存,使用缓存响应快但是可能更新不及时<para>默认:false</para></param>
<returns>错误返回null,成功返回JObject</returns>
</member>
@@ -351,7 +371,7 @@
<summary>
获取VIP信息
</summary>
<param name="QID">QQ号</param>
<param name="UserID">QQ号</param>
<returns>错误返回null,成功返回JObject</returns>
</member>
<member name="M:AuroraNative.Api.SendGroupNotice(System.Int64,System.String)">
@@ -703,146 +723,34 @@
请求事件
</summary>
</member>
<member name="T:AuroraNative.Event">
<member name="T:AuroraNative.LogLevel">
<summary>
事件类
表示日志信息等级的枚举
</summary>
</member>
<member name="M:AuroraNative.Event.LifeCycle(AuroraNative.EventArgs.LifeCycleArgs)">
<member name="F:AuroraNative.LogLevel.Debug">
<summary>
元事件 - 生命周期
表示输出日志的等级是 "调试" 级别
</summary>
<param name="e">生命周期事件参数</param>
</member>
<member name="M:AuroraNative.Event.HeartBeat(AuroraNative.EventArgs.HeartBeatArgs)">
<member name="F:AuroraNative.LogLevel.Info">
<summary>
元事件 - 心跳
表示输出日志的等级是 "信息" 级别
</summary>
<param name="e">心跳事件参数</param>
</member>
<member name="M:AuroraNative.Event.PrivateMessage(AuroraNative.EventArgs.PrivateMessageArgs)">
<member name="F:AuroraNative.LogLevel.Warning">
<summary>
消息事件 - 私聊消息
表示输出日志的等级是 "警告" 级别
</summary>
<param name="e">私聊消息参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMessage(AuroraNative.EventArgs.GroupMessageArgs)">
<member name="F:AuroraNative.LogLevel.Error">
<summary>
消息事件 - 群消息
表示输出日志的等级是 "错误" 级别
</summary>
<param name="e">群消息参数</param>
</member>
<member name="M:AuroraNative.Event.FriendAddRequest(AuroraNative.EventArgs.FriendAddRequsetArgs)">
<member name="F:AuroraNative.LogLevel.Off">
<summary>
请求事件 - 好友请求
</summary>
<param name="e">好友请求参数</param>
</member>
<member name="M:AuroraNative.Event.GroupAddRequest(AuroraNative.EventArgs.GroupAddRequestArgs)">
<summary>
请求事件 - 群请求
</summary>
<param name="e">群请求参数</param>
</member>
<member name="M:AuroraNative.Event.GroupUpload(AuroraNative.EventArgs.GroupUploadArgs)">
<summary>
通知事件 - 群文件上传
</summary>
<param name="e">群文件上传参数</param>
</member>
<member name="M:AuroraNative.Event.GroupManageChange(AuroraNative.EventArgs.GroupManageChangeArgs)">
<summary>
通知事件 - 群管理员变动
</summary>
<param name="e">群管理员变动参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMemberDecrease(AuroraNative.EventArgs.GroupMemberDecreaseArgs)">
<summary>
通知事件 - 群成员减少
</summary>
<param name="e">群成员减少参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMemberIncrease(AuroraNative.EventArgs.GroupMemberIncreaseArgs)">
<summary>
通知事件 - 群成员增加
</summary>
<param name="e">群成员增加参数</param>
</member>
<member name="M:AuroraNative.Event.GroupBanSpeak(AuroraNative.EventArgs.GroupBanSpeakArgs)">
<summary>
通知事件 - 群禁言
</summary>
<param name="e">群禁言参数</param>
</member>
<member name="M:AuroraNative.Event.FriendAdd(AuroraNative.EventArgs.FriendAddArgs)">
<summary>
通知事件 - 好友添加
</summary>
<param name="e">好友添加参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMessageRecall(AuroraNative.EventArgs.GroupMessageRecallArgs)">
<summary>
通知事件 - 群消息撤回
</summary>
<param name="e">群消息撤回参数</param>
</member>
<member name="M:AuroraNative.Event.PrivateMessageRecall(AuroraNative.EventArgs.PrivateMessageRecallArgs)">
<summary>
通知事件 - 好友消息撤回
</summary>
<param name="e">好友消息撤回参数</param>
</member>
<member name="M:AuroraNative.Event.GroupPoke(AuroraNative.EventArgs.GroupPokeArgs)">
<summary>
通知事件 - 群内戳一戳
</summary>
<param name="e">群内戳一戳参数</param>
</member>
<member name="M:AuroraNative.Event.PrivatePoke(AuroraNative.EventArgs.PrivatePokeArgs)">
<summary>
通知事件 - 好友戳一戳
</summary>
<param name="e">群内戳一戳参数</param>
</member>
<member name="M:AuroraNative.Event.GroupRedPoketLuckyKing(AuroraNative.EventArgs.GroupRedPoketLuckyKingArgs)">
<summary>
通知事件 - 群红包运气王提示
</summary>
<param name="e">群红包运气王提示参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMemberHonorChange(AuroraNative.EventArgs.GroupMemberHonorChangeArgs)">
<summary>
通知事件 - 群成员荣誉变更提示
</summary>
<param name="e">群成员荣誉变更提示参数</param>
</member>
<member name="M:AuroraNative.Event.GroupCardVerify(AuroraNative.EventArgs.GroupCardVerifyArgs)">
<summary>
通知事件 - 群成员名片更新(核验)
</summary>
<param name="e">群成员名片更新(核验)参数</param>
</member>
<member name="M:AuroraNative.Event.GetOfflineFile(AuroraNative.EventArgs.GetOfflineFileArgs)">
<summary>
通知事件 - 接收到离线文件
</summary>
<param name="e">接收到离线文件参数</param>
</member>
<member name="M:AuroraNative.Event.ClientStatusChange(AuroraNative.EventArgs.ClientStatusChangeArgs)">
<summary>
通知事件 - 其他客户端在线状态变更
</summary>
<param name="e">其他客户端在线状态变更参数</param>
</member>
<member name="M:AuroraNative.Event.EssenceMessageChange(AuroraNative.EventArgs.EssenceMessageChangeArgs)">
<summary>
通知事件 - 精华消息变更
</summary>
<param name="e">精华消息变更参数</param>
</member>
<member name="M:AuroraNative.Event.RouterNotify(Newtonsoft.Json.Linq.JObject)">
<summary>
请勿使用,用于子事件分发
表示不输出日志
</summary>
</member>
<member name="T:AuroraNative.EventArgs.Anonymous">
@@ -1789,6 +1697,148 @@
异常 类 -- 关于WebSocket异常
</summary>
</member>
<member name="T:AuroraNative.Event">
<summary>
事件类
</summary>
</member>
<member name="M:AuroraNative.Event.LifeCycle(AuroraNative.EventArgs.LifeCycleArgs)">
<summary>
元事件 - 生命周期
</summary>
<param name="e">生命周期事件参数</param>
</member>
<member name="M:AuroraNative.Event.HeartBeat(AuroraNative.EventArgs.HeartBeatArgs)">
<summary>
元事件 - 心跳
</summary>
<param name="e">心跳事件参数</param>
</member>
<member name="M:AuroraNative.Event.PrivateMessage(AuroraNative.EventArgs.PrivateMessageArgs)">
<summary>
消息事件 - 私聊消息
</summary>
<param name="e">私聊消息参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMessage(AuroraNative.EventArgs.GroupMessageArgs)">
<summary>
消息事件 - 群消息
</summary>
<param name="e">群消息参数</param>
</member>
<member name="M:AuroraNative.Event.FriendAddRequest(AuroraNative.EventArgs.FriendAddRequsetArgs)">
<summary>
请求事件 - 好友请求
</summary>
<param name="e">好友请求参数</param>
</member>
<member name="M:AuroraNative.Event.GroupAddRequest(AuroraNative.EventArgs.GroupAddRequestArgs)">
<summary>
请求事件 - 群请求
</summary>
<param name="e">群请求参数</param>
</member>
<member name="M:AuroraNative.Event.GroupUpload(AuroraNative.EventArgs.GroupUploadArgs)">
<summary>
通知事件 - 群文件上传
</summary>
<param name="e">群文件上传参数</param>
</member>
<member name="M:AuroraNative.Event.GroupManageChange(AuroraNative.EventArgs.GroupManageChangeArgs)">
<summary>
通知事件 - 群管理员变动
</summary>
<param name="e">群管理员变动参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMemberDecrease(AuroraNative.EventArgs.GroupMemberDecreaseArgs)">
<summary>
通知事件 - 群成员减少
</summary>
<param name="e">群成员减少参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMemberIncrease(AuroraNative.EventArgs.GroupMemberIncreaseArgs)">
<summary>
通知事件 - 群成员增加
</summary>
<param name="e">群成员增加参数</param>
</member>
<member name="M:AuroraNative.Event.GroupBanSpeak(AuroraNative.EventArgs.GroupBanSpeakArgs)">
<summary>
通知事件 - 群禁言
</summary>
<param name="e">群禁言参数</param>
</member>
<member name="M:AuroraNative.Event.FriendAdd(AuroraNative.EventArgs.FriendAddArgs)">
<summary>
通知事件 - 好友添加
</summary>
<param name="e">好友添加参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMessageRecall(AuroraNative.EventArgs.GroupMessageRecallArgs)">
<summary>
通知事件 - 群消息撤回
</summary>
<param name="e">群消息撤回参数</param>
</member>
<member name="M:AuroraNative.Event.PrivateMessageRecall(AuroraNative.EventArgs.PrivateMessageRecallArgs)">
<summary>
通知事件 - 好友消息撤回
</summary>
<param name="e">好友消息撤回参数</param>
</member>
<member name="M:AuroraNative.Event.GroupPoke(AuroraNative.EventArgs.GroupPokeArgs)">
<summary>
通知事件 - 群内戳一戳
</summary>
<param name="e">群内戳一戳参数</param>
</member>
<member name="M:AuroraNative.Event.PrivatePoke(AuroraNative.EventArgs.PrivatePokeArgs)">
<summary>
通知事件 - 好友戳一戳
</summary>
<param name="e">群内戳一戳参数</param>
</member>
<member name="M:AuroraNative.Event.GroupRedPoketLuckyKing(AuroraNative.EventArgs.GroupRedPoketLuckyKingArgs)">
<summary>
通知事件 - 群红包运气王提示
</summary>
<param name="e">群红包运气王提示参数</param>
</member>
<member name="M:AuroraNative.Event.GroupMemberHonorChange(AuroraNative.EventArgs.GroupMemberHonorChangeArgs)">
<summary>
通知事件 - 群成员荣誉变更提示
</summary>
<param name="e">群成员荣誉变更提示参数</param>
</member>
<member name="M:AuroraNative.Event.GroupCardVerify(AuroraNative.EventArgs.GroupCardVerifyArgs)">
<summary>
通知事件 - 群成员名片更新(核验)
</summary>
<param name="e">群成员名片更新(核验)参数</param>
</member>
<member name="M:AuroraNative.Event.GetOfflineFile(AuroraNative.EventArgs.GetOfflineFileArgs)">
<summary>
通知事件 - 接收到离线文件
</summary>
<param name="e">接收到离线文件参数</param>
</member>
<member name="M:AuroraNative.Event.ClientStatusChange(AuroraNative.EventArgs.ClientStatusChangeArgs)">
<summary>
通知事件 - 其他客户端在线状态变更
</summary>
<param name="e">其他客户端在线状态变更参数</param>
</member>
<member name="M:AuroraNative.Event.EssenceMessageChange(AuroraNative.EventArgs.EssenceMessageChangeArgs)">
<summary>
通知事件 - 精华消息变更
</summary>
<param name="e">精华消息变更参数</param>
</member>
<member name="M:AuroraNative.Event.RouterNotify(Newtonsoft.Json.Linq.JObject)">
<summary>
请勿使用,用于子事件分发
</summary>
</member>
<member name="T:AuroraNative.Logger">
<summary>
彩色日志输出类
@@ -1827,31 +1877,6 @@
<param name="Message">要输出的信息</param>
<param name="MethodName">输出的方法名,可选传入</param>
</member>
<member name="T:AuroraNative.LogLevel">
<summary>
表示日志信息等级的枚举
</summary>
</member>
<member name="F:AuroraNative.LogLevel.Debug">
<summary>
表示输出日志的等级是 "调试" 级别
</summary>
</member>
<member name="F:AuroraNative.LogLevel.Info">
<summary>
表示输出日志的等级是 "信息" 级别
</summary>
</member>
<member name="F:AuroraNative.LogLevel.Warning">
<summary>
表示输出日志的等级是 "警告" 级别
</summary>
</member>
<member name="F:AuroraNative.LogLevel.Error">
<summary>
表示输出日志的等级是 "错误" 级别
</summary>
</member>
<member name="T:AuroraNative.Utils">
<summary>
通用方法 类
@@ -1862,7 +1887,7 @@
通过 枚举Description 转为枚举
</summary>
<typeparam name="T">枚举</typeparam>
<param name="description">需要转换的Description</param>
<param name="Description">需要转换的Description</param>
<returns>返回该枚举</returns>
</member>
<member name="M:AuroraNative.Utils.GetChildTypeByPostType(Newtonsoft.Json.Linq.JObject)">
@@ -1883,6 +1908,16 @@
WebSocket 基础类
</summary>
</member>
<member name="M:AuroraNative.WebSockets.BaseWebSocket.Create">
<summary>
客户端创建 抽象方法
</summary>
</member>
<member name="M:AuroraNative.WebSockets.BaseWebSocket.Dispose">
<summary>
客户端销毁 抽象方法
</summary>
</member>
<member name="M:AuroraNative.WebSockets.BaseWebSocket.Send(AuroraNative.BaseAPI)">
<summary>
发送数据到服务端/客户端
@@ -1897,7 +1932,12 @@
</member>
<member name="P:AuroraNative.WebSockets.Client.host">
<summary>
WebSocket服务端地址<para>请记得带端口号</para>
WebSocket服务端地址
</summary>
</member>
<member name="P:AuroraNative.WebSockets.Client.port">
<summary>
WebSocket服务端端口号
</summary>
</member>
<member name="M:AuroraNative.WebSockets.Client.#ctor(AuroraNative.Event)">

View File

@@ -0,0 +1,29 @@
namespace AuroraNative
{
/// <summary>
/// 表示日志信息等级的枚举
/// </summary>
public enum LogLevel
{
/// <summary>
/// 表示输出日志的等级是 "调试" 级别
/// </summary>
Debug = 0,
/// <summary>
/// 表示输出日志的等级是 "信息" 级别
/// </summary>
Info = 1,
/// <summary>
/// 表示输出日志的等级是 "警告" 级别
/// </summary>
Warning = 2,
/// <summary>
/// 表示输出日志的等级是 "错误" 级别
/// </summary>
Error = 3,
/// <summary>
/// 表示不输出日志
/// </summary>
Off = 4
}
}

View File

@@ -1,61 +0,0 @@
using AuroraNative.EventArgs;
using Newtonsoft.Json;
using System;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
namespace AuroraNative
{
/// <summary>
/// Enum和Description特性互转 转换器
/// </summary>
internal class EnumDescriptionConverter : JsonConverter
{
/// <summary>
/// 当属性的值为枚举类型时才使用转换器
/// </summary>
/// <param name="objectType">目标类型</param>
/// <returns>返回布尔值</returns>
public override bool CanConvert(Type objectType) => objectType == typeof(Enum);
/// <summary>
/// 获取枚举的描述值
/// </summary>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (string.IsNullOrEmpty(value.ToString()))
{
writer.WriteValue("");
return;
}
FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
if (fieldInfo == null)
{
writer.WriteValue("");
return;
}
DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
writer.WriteValue(attributes.Length > 0 ? attributes[0].Description : "");
}
/// <summary>
/// 通过Description获取枚举值
/// </summary>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
foreach (FieldInfo field in objectType.GetFields())
{
object[] objects = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (objects.Any(item => (item as DescriptionAttribute)?.Description == reader.Value?.ToString()))
{
return Convert.ChangeType(field.GetValue(-1), objectType);
}
}
return CQCodeType.Unknown;
}
}
}

View File

@@ -1,12 +1,14 @@
using AuroraNative.EventArgs;
using AuroraNative.WebSockets;
using Newtonsoft.Json.Linq;
using System;
namespace AuroraNative
{
/// <summary>
/// 事件类
/// </summary>
public class Event
public abstract class Event
{
#region ----
@@ -230,5 +232,23 @@ namespace AuroraNative
#endregion
#endregion
#region ----
internal static async void CheckVersion()
{
Logger.Debug("开始检查 go-cqhttp 版本是否符合最低版本...");
if ((await Api.CurrentApi.GetVersionInfo()).TryGetValue("AppVersion", out object Version) && new Version(Version.ToString().Substring(1, Version.ToString().IndexOf('-') - 1)) < BaseWebSocket.DependencyVersion)
{
Logger.Warning($"框架最低依赖版本与 go-cqhttp 不符!请检查是否为最新的框架或符合的 go-cqhttp\ngo-cqhttp版本:{Version}\n框架最低依赖版本:v{BaseWebSocket.DependencyVersion}");
}
else
{
Logger.Debug("go-cqhttp 版本符合最低版本!");
}
BaseWebSocket.IsCheckVersion = true;
}
#endregion
}
}

View File

@@ -27,7 +27,7 @@ namespace AuroraNative
{
if (LogLevel <= LogLevel.Debug)
{
Output(Message, ConsoleColor.Gray, LogLevel.Debug, MethodName);
Output(Message, ConsoleColor.Gray, LogLevel.Debug, MethodName, true);
}
}
@@ -74,43 +74,31 @@ namespace AuroraNative
#region ----
internal static void Output(string Message, ConsoleColor Color, LogLevel Level, string MethodName)
internal static void Output(string Message, ConsoleColor Color, LogLevel Level, string MethodName, bool IsFine = false)
{
Console.ForegroundColor = Color;
if (MethodName != null)
string NowTime;
if (!IsFine)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + $" [{Level}]" + $" [{MethodName}] " + Message);
NowTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
}
else
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + $" [{Level}] " + Message);
NowTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff");
}
if (MethodName != null)
{
Console.WriteLine($"[{NowTime}]" + $" [{Level}]" + $" [{MethodName}]: " + Message);
}
else
{
Console.WriteLine($"[{NowTime}]" + $" [{Level}]: " + Message);
}
Console.ForegroundColor = ConsoleColor.White;
}
#endregion
}
/// <summary>
/// 表示日志信息等级的枚举
/// </summary>
public enum LogLevel
{
/// <summary>
/// 表示输出日志的等级是 "调试" 级别
/// </summary>
Debug = 0,
/// <summary>
/// 表示输出日志的等级是 "信息" 级别
/// </summary>
Info = 1,
/// <summary>
/// 表示输出日志的等级是 "警告" 级别
/// </summary>
Warning = 2,
/// <summary>
/// 表示输出日志的等级是 "错误" 级别
/// </summary>
Error = 3
}
}

View File

@@ -17,20 +17,34 @@ namespace AuroraNative.WebSockets
{
#region ----
internal int Port = 6700;
internal WebSocket WebSocket;
internal Event EventHook;
internal JObject Json;
internal static Type[] AttributeTypes;
internal static readonly Type[] AttributeTypes = Assembly.GetExecutingAssembly().GetTypes().Where(p => p.IsAbstract == false && p.IsInterface == false && typeof(Attribute).IsAssignableFrom(p)).ToArray();
internal static readonly Version DependencyVersion = new Version("0.9.40");
internal static bool IsCheckVersion = false;
#endregion
#region ----
/// <summary>
/// 客户端创建 抽象方法
/// </summary>
public abstract void Create();
/// <summary>
/// 客户端销毁 抽象方法
/// </summary>
public abstract void Dispose();
internal abstract void Feedback();
/// <summary>
/// 发送数据到服务端/客户端
/// </summary>
/// <param name="Json">传输Json格式的文本</param>
public void Send(BaseAPI Json)
internal void Send(BaseAPI Json)
{
try
{
@@ -64,7 +78,7 @@ namespace AuroraNative.WebSockets
{
foreach (MethodInfo Method in EventHook.GetType().GetMethods().Where(p => p.GetCustomAttribute<PostTypeAttribute>() != null))
{
if (Method.GetCustomAttribute(Type) is BaseAttribute attribute && attribute.Type == (string)Json.GetValue(Utils.GetChildTypeByPostType(Json)))
if (Method.GetCustomAttribute(Type) is BaseAttribute Attribute && Attribute.Type == (string)Json.GetValue(Utils.GetChildTypeByPostType(Json)))
{
ParameterInfo Parameter = Method.GetParameters().SingleOrDefault();

View File

@@ -1,7 +1,7 @@
using System;
using System.Linq;
using System.Net.WebSockets;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -15,25 +15,41 @@ namespace AuroraNative.WebSockets
{
#region ----
private string Host = "127.0.0.1:6700";
private string Host = "127.0.0.1";
/// <summary>
/// WebSocket服务端地址<para>请记得带端口号</para>
/// WebSocket服务端地址
/// </summary>
public string host
{
private get { return Host; }
set { Host = value; }
set
{
if (value.Contains(":"))
{
string[] Cache = value.Split(':');
Host = Cache[0];
Port = int.Parse(Cache[1]);
}
else
{
Host = value;
}
}
}
/// <summary>
/// WebSocket服务端端口号
/// </summary>
public int port
{
private get { return Port; }
set { Port = value; }
}
#endregion
#region ----
static Client()
{
AttributeTypes = Assembly.GetExecutingAssembly().GetTypes().Where(p => p.IsAbstract == false && p.IsInterface == false && typeof(Attribute).IsAssignableFrom(p)).ToArray();
}
/// <summary>
/// 创建一个 <see cref="Client"/> 实例
/// </summary>
@@ -47,8 +63,13 @@ namespace AuroraNative.WebSockets
/// <summary>
/// 创建并连接到WebSocket服务器
/// </summary>
public bool Create()
public override void Create()
{
StringBuilder Cache = new StringBuilder();
Cache.Append(Host);
Cache.Append(':');
Cache.Append(Port);
Logger.Debug("正向WebSocket已创建准备连接...", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
for (int i = 1; i < 4; i++)
{
@@ -57,8 +78,8 @@ namespace AuroraNative.WebSockets
WebSocket = new ClientWebSocket();
if (WebSocket is ClientWebSocket socket)
{
Logger.Debug($"准备连接至IP:{Host}", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
Task Connect = socket.ConnectAsync(new Uri("ws://" + Host + "/"), CancellationToken.None);
Logger.Debug($"准备连接至IP:{Cache}", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
Task Connect = socket.ConnectAsync(new Uri("ws://" + Cache.ToString() + "/"), CancellationToken.None);
Connect.Wait();
if (WebSocket.State == WebSocketState.Open)
{
@@ -68,7 +89,7 @@ namespace AuroraNative.WebSockets
Logger.Debug("go-cqhttp 初始化完毕!");
Task.Run(Feedback);
Api.Create(this);
return true;
return;
}
}
}
@@ -79,13 +100,12 @@ namespace AuroraNative.WebSockets
}
}
Logger.Error("连接到 go-cqhttp 服务器失败请检查IP是否正确(需要携带端口号)或确认服务器是否启动和初始化完毕!", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
return false;
}
/// <summary>
/// 立刻中断并释放连接<para>注意断开后需要重新Create</para>
/// </summary>
public void Dispose()
public override void Dispose()
{
Logger.Debug($"准备销毁正向WebSocket...", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
try
@@ -105,7 +125,7 @@ namespace AuroraNative.WebSockets
#region ----
private async void Feedback()
internal override async void Feedback()
{
while (true)
{

View File

@@ -1,5 +1,4 @@
using System;
using System.Linq;
using System.Net;
using System.Net.WebSockets;
using System.Reflection;
@@ -16,11 +15,10 @@ namespace AuroraNative.WebSockets
{
#region ----
private string Port = "6700";
/// <summary>
/// WebSocket监听端口
/// </summary>
public string port
public int port
{
private get { return Port; }
set { Port = value; }
@@ -33,11 +31,6 @@ namespace AuroraNative.WebSockets
#region ----
static Server()
{
AttributeTypes = Assembly.GetExecutingAssembly().GetTypes().Where(p => p.IsAbstract == false && p.IsInterface == false && typeof(Attribute).IsAssignableFrom(p)).ToArray();
}
/// <summary>
/// 创建一个 <see cref="Server"/> 实例
/// </summary>
@@ -51,13 +44,13 @@ namespace AuroraNative.WebSockets
/// <summary>
/// 创建WebSocket服务器并监听端口
/// </summary>
public void Create()
public override void Create()
{
try
{
Logger.Debug("反向WebSocket已创建准备监听...", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
Listener = new HttpListener();
Listener.Prefixes.Add("http://*:" + Port + "/");
Listener.Prefixes.Add("http://*:" + Port.ToString() + "/");
Listener.Start();
Logger.Info("开始监听来自 go-cqhttp 客户端的连接...");
Task.Run(Feedback);
@@ -77,7 +70,7 @@ namespace AuroraNative.WebSockets
/// <summary>
/// 立刻中断并释放连接<para>注意断开后需要重新Create</para>
/// </summary>
public void Dispose()
public override void Dispose()
{
Logger.Debug($"准备销毁反向WebSocket...", $"{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}");
try
@@ -98,7 +91,7 @@ namespace AuroraNative.WebSockets
#region ----
private async void Feedback()
internal override async void Feedback()
{
while (true)
{