Code Monkey home page Code Monkey logo

mirai-csharp's Introduction

mirai-csharp's People

Contributors

executor-cheng avatar slimenull avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

mirai-csharp's Issues

请求添加版本说明

最近Mirai API Http似乎进行了不兼容更新, 不知道这个框架是否是兼容两种版本的, 同时我注意到Nuget上可以下载到多版本的Mirai-CSharp,也许在read me中加个说明会比较好?

即,希望说明Mirai-CSharp和Mirai-API-Http之间版本的关系

(顺便,我也没搞清楚到底是否兼容,至今机器人还没跑起来,还抛类似于"无法识别的指令"的异常,Orz

附:使用的Nuget包为Mirai-CSharp 1.0.2.1

如何主动调出session并调用方法

我把mirai-csharp和asp .net core 整合在一起,例如我有个api方法中,想使用调用MiraiHttpSession 发送我指定的内容给指定群,需要如何优雅实现呢?目前只能在事件回调的参数中使用MiraiHttpSession

处理加群申请时获取加群问题的回答

是否有办法在处理加群申请时获取加群问题的回答?

我通过Mirai-CSharp操作Mirai,现在希望能够在处理加群时获取用户对加群问题的回答,并以此判定是否同意。请问是否已经可行,或是否有可能在未来可行?

我曾在mirai提交过同样的issue:
mamoe/mirai#697

如何发送Quote消息?

请求添加一个回复消息的案例
image
这里的messageId是什么?在代码中如何获取?
感谢您的贡献!

关于2.0版本的连接方式

按照项目mirai-api-http2.0+的连接方式 是把http和ws分离开了
但是看Mirai-CSharp项目源码似乎还是http认证连接然后ws负责接收消息?
还请解惑

更新 README, 试着使用以下内容

Mirai-CSharp

关于本项目

这是一个帮助C#开发者与 Mirai 交互的项目
它通过调用 mirai-api-http 提供的 http-api 与其交互

开始使用

安装

最简单的方式是从 nuget 上获取 Mirai-CSharp 包, 并且我们也推荐你在 nuget 包管理器中为项目安装它, 不过你也可以手动克隆项目, 编译, 并直接引用链接库.

在使用 nuget 安装包时, 如若要使用最新功能, 请勾选 "包括发行版"

注意, 最新版本已将包分离为 Mirai-CSharp 以及 Mirai-CSharp.HttpApi, 其中第一个中只包含程序接口之类的, 第二个中包含的是其实现

示例

下面以一个最简单的控制台程序为示例, 对 QQ 内的任何 at 自己了的群聊消息响应 "Hello world" 文本消息

在目前的最新版本中, Mirai-CSharp 的常用核心组件位于 Mirai.CSharp 以及 Mirai.CSharp.Models 命名空间中.

在已正式发布的最新版本中, 命名空间是 Mirai_CSharp 而不是 Mirai.CSharp

首先我们可以引用它, 下面是基础框架:

using System;
using System.Linq;
using Mirai.CSharp;
using Mirai.CSharp.Models;

namespace TestProj
{
    class Program
    {
        static void Main(string[] args)
        {
            
        }
    }
}

Mirai-CSharp 是要与 Mirai 的 mira-http-api 进行交互的, 所以我们接下来创建一个会话(Session), 并连接到在 Mirai 中已经登录的 QQ

// 下面是位于 Main 方法的代码
MiraiHttpSession session = new MiraiHttpSession();               // 创建会话
session.ConnectAsync(                                            // 连接并等待
    new MiraiHttpSessionOptions("localhost", 1234, "authKey"),   // 连接选项, 地址, 端口, 以及验证密钥, 这些均位于 mirai-http-api 配置文件中
    1234567890).Wait();                                          // Mirai 中已经登录的 QQ 机器人的 QQ 号码	

下面为 session 添加群聊成员消息时间的处理方法:

// 下面是位于 Main 方法的代码
session.GroupMessageEvt += async (sender, e) =>      
{
    await sender.SendGroupMessageAsync(e.Sender.Group.Id, new PlainMessage("Hello world"));   // 在消息发送者所在的群聊内发送 Hello world
    return false;
};
session.GroupMessageEvt += async (sender, e) =>      // Mirai-CSharp 的事件处理应该是纯异步的, 我们应该使用异步方法(返回Task<bool>)
{
    if (e.Chain.Where(v => v is AtMessage atMsg && atMsg.Target == session.QQNumber).Any())       // 判断是否 at 自己
        await sender.SendGroupMessageAsync(e.Sender.Group.Id, new PlainMessage("Hello world"));   // 发送 "Hello world"
    
    // PlainMessage 位于 Mirai.CSharp.Models 命名空间下, 基于 IMessage 

    return false;    // Task 的返回结果标识当前事件是否被阻断, 如果返回 true, 那么后面的事件订阅者将不会收到事件 (这里返回false表示不阻断)
};

注意事项

  • 本项目使用C# 9.0编写, 你需要至少.NET Core 2.0.NET Framework 4.6.1才能使用本项目, 其中所有的api均为异步方法

使用例子

好友消息撤回事件的参数问题

好友消息撤回参数IFriendMessageRevokedEventArgs内的原发送时间属性SentTime在1970年左右

看了一下mcl输出的时间戳是10位 有可能把10位的时间戳也用毫秒来计算实际的发送时间了

根据Example写,部署linux后,cpu占用90%+

首先非常感谢作者提供的项目,让我这个小白也能顺利写qqbot来用。

问题描述

关于这个Example main函数里的死循环


我在部署CentOS7之后 cpu占用一直高居90%+,但是自己在vs调试又是正常的。

解决

百度到的办法
办法就是在循环里加一行 Thread.Sleep(1000);

   while (true)
   {
        Thread.Sleep(1000);
         if (await Console.In.ReadLineAsync() == "exit")
         {
              return;
         }
    }

希望能帮助到同样遇到这个问题的盆友。。(是我太菜了)

2.0.0计划表

直接跳major版本了
可能会弃用.NET Standard 2.0&.NET Framework 4.6.1的支持, 要实现依赖注入的消息框架, 默认接口实现功能不可缺少

予以支持

也可能弃用掉MiraiSession里边的所有events

考虑公开一个接口, 接口成员均为event

  • 使用依赖注入重新设计本项目(#48 )
  • 添加native支持(#22 )
  • 支持mirai Code Specification - mirai 码(#2 )
  • 考虑转化所有EventArgs为record(#24 ) (不予支持。继承方面有一些问题)
  • 为await添加ConfigureAwait(#51 )
  • 实现合并转发(#49 )
  • 更改主要命名空间为Mirai.CSharp (#57 )
  • 重写示例

关于UploadPictureAsync对图片流格式的问题

通过WebRequest.Create(url).GetResponse().GetResponseStream()获取的图片流传入UploadPictureAsync会在imgStream.Seek(0, SeekOrigin.Begin);处报Specified method is not supported. 然后我注释了Seek这句, 接着它又在PostAsync处报'u' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0.

尝试过将图片下载到本地然后用FileStream读取传进来是没有问题的.
也试了把Image.Save进MemorySteam, 然后传进来, 这样的话消息发的出去, 但是图片是裂图.
互联网上的图片, 不想经过硬盘, 有没有什么处理方式?

Mirai-CSharp版本1.0.2.1
mirai-api-http版本1.9.5

添加MessageBuilder及对应的IMessageBuilder接口

Proposal:

public interface IMessageBuilder
{
    IMessageBase[] ToMessages();
}

在Extensions文件夹下为Builder添加相应的静态类用于承载扩展方法。
在三大异步发送消息方法添加相应的重载。

BOT重新登录事件继承问题

文件位置:MiraiCsharp\Mirai-CSharp.HttpApi\Models\EventArgs\Bot\BotReloginEventArgs.cs

BotReloginEventArgs为什么继承了IBotOnlineEventArgs而不是IBotReloginEventArgs
然后在parser做属性标记时就无法进行标记,后续也无法让对应handler进行处理

好友输入状态改变时会抛出异常

引发异常内容
引发了异常: System.Private.CoreLib.dll 中的“System.InvalidOperationException”(“The converter specified on 'Mirai.CSharp.HttpApi.Models.EventArgs.FriendInputStatusChangedEventArgs.Friend' is not compatible with the type 'Mirai.CSharp.HttpApi.Models.IFriendInfo'.”)

调用堆栈
在 System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializationConverterOnAttributeNotCompatible(Type classTypeAttributeIsOn, PropertyInfo propertyInfo, Type typeToConvert) 在 System.Text.Json.JsonSerializerOptions.GetConverterFromAttribute(JsonConverterAttribute converterAttribute, Type typeToConvert, Type classTypeAttributeIsOn, PropertyInfo propertyInfo) 在 System.Text.Json.JsonSerializerOptions.DetermineConverterForProperty(Type parentClassType, Type runtimePropertyType, PropertyInfo propertyInfo) 在 System.Text.Json.JsonClassInfo.CreateProperty(Type declaredPropertyType, Type runtimePropertyType, Type implementedPropertyType, PropertyInfo propertyInfo, Type parentClassType, JsonConverter converter, JsonSerializerOptions options) 在 System.Text.Json.JsonClassInfo.AddProperty(Type propertyType, PropertyInfo propertyInfo, Type classType, JsonSerializerOptions options) 在 System.Text.Json.JsonClassInfo..ctor(Type type, JsonSerializerOptions options) 在 System.Text.Json.JsonSerializerOptions.GetOrAddClass(Type classType) 在 System.Text.Json.JsonSerializer.ReadCore(Type returnType, JsonSerializerOptions options, Utf8JsonReader& reader) 在 System.Text.Json.JsonSerializer.ParseCore(ReadOnlySpan1 utf8Json, Type returnType, JsonSerializerOptions options)
在 System.Text.Json.JsonSerializer.Deserialize[TValue](ReadOnlySpan1 utf8Json, JsonSerializerOptions options) 在 Mirai.CSharp.HttpApi.Utility.Utils.Deserialize[T](JsonElement element, JsonSerializerOptions options) 在 D:\Dev\C#\MiraiCsharp\Mirai-CSharp.HttpApi\Utility\Utils.cs 中: 第 30 行 在 Mirai.CSharp.HttpApi.Parsers.DefaultMappableMiraiHttpMessageParser2.Parse(JsonElement& root) 在 D:\Dev\C#\MiraiCsharp\Mirai-CSharp.HttpApi\Parsers\DefaultMappableMiraiHttpMessageParser.cs 中: 第 31 行
在 Mirai.CSharp.Framework.Parsers.MessageParser2.Mirai.CSharp.Framework.Parsers.IMessageParser<TRawdata>.Parse(TRawdata& root) 在 D:\Dev\C#\MiraiCsharp\Mirai-CSharp\Framework\Parsers\IMessageParser.cs 中: 第 89 行 在 Mirai.CSharp.Framework.Invoking.MessageHandlerInvoker2.d__5.MoveNext() 在 D:\Dev\C#\MiraiCsharp\Mirai-CSharp\Framework\Invoking\MessageHandlerInvoker.cs 中: 第 100 行
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Mirai.CSharp.HttpApi.Session.MiraiHttpSession.d__82.MoveNext() 在 D:\Dev\C#\MiraiCsharp\Mirai-CSharp.HttpApi\Session\MiraiHttpSession.ReceiveMessage.cs 中: 第 61 行`

复现方式
让BOT的好友和BOT进行输入,确保输入状态对BOT可见即可

关于发送群消息图片无法正常发送的问题

有可能是用法有误 但是不太确定 我把具体细节列一下

场景:发送群消息
发送方法:
1.使用{guid}.mirai 无效(这个是已经接收到图片并将该图片再次发送出去)
2.使用腾讯图片服务器的图片地址 无效
3.使用本地路径发送 无效

其中发送过程是这样的:不经过UploadPictureAsync接口,直接实例化ImageMessage,并对对应属性进行赋值,后续组合成消息链数组发送

附带http请求报文和回复

{"sessionKey":"jRarU388","qq":null,"group":xxx,"quote":null,"messageChain":[{"type":"Image","imageId":"{B33D0D9A-220C-201A-6ADF-E44A8A7E1556}.jpg","url":null,"path":null}]}

{"code":0,"msg":"success","messageId":-1}

不知道是不是我调用方法有误(即必须经过UploadPictureAsync接口 但是方法1应该不需要再经过此才对)

给BOT发送陌生人消息会引起异常

准备发送陌生人消息生成IStrangerMessageEventArgs以进行组件测试时引发异常
异常内容:
System.NotSupportedException:“Deserialization of interface types is not supported. Type 'Mirai.CSharp.HttpApi.Models.IStrangerInfo'”
调用堆栈:

   在 System.Text.Json.ThrowHelper.ThrowNotSupportedException_DeserializeCreateObjectDelegateIsNull(Type invalidType)
   在 System.Text.Json.JsonSerializer.HandleStartObject(JsonSerializerOptions options, ReadStack& state)
   在 System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions options, Utf8JsonReader& reader, ReadStack& readStack)
   在 System.Text.Json.JsonSerializer.ReadCore(Type returnType, JsonSerializerOptions options, Utf8JsonReader& reader)
   在 System.Text.Json.JsonSerializer.ParseCore(ReadOnlySpan`1 utf8Json, Type returnType, JsonSerializerOptions options)
   在 System.Text.Json.JsonSerializer.Deserialize[TValue](ReadOnlySpan`1 utf8Json, JsonSerializerOptions options)
   在 Mirai.CSharp.HttpApi.Utility.Utils.Deserialize[T](JsonElement element, JsonSerializerOptions options) 在 D:\Dev\C#\MiraiCsharp\Mirai-CSharp.HttpApi\Utility\Utils.cs 中: 第 30 行

复现方法
让一个陌生人(即BOT设置所有人均可直接添加,他人添加BOT后默认为陌生人)给BOT发送消息即可

处理多BOT的问题

除了在EXAMPLE内写明的 自行构造继承类 构造参数使用IOptionsSnapshot
还有在别的ISSUE看到的“每一个IServiceScope对应一个IMiraiHttpSession”
那是不是可以理解为我只要创建一个IServiceProvider
然后每次有新BOT的时候就调用一次provider的CreateScope方法拿到scope即可?

消息类的一些问题

public string Message { get; set; } = null!;

建议改为 private set,包括其他地方id、target之类的属性,按理说这些属性在实例化以后不应该被修改

主要是我希望把消息链逐个传到每个模块中处理消息的方法,希望能从语法上避免前面的模块不小心修改了消息的内容导致后面的模块处理出现异常的问题

不支持mirai-api-http 1.9.0-dev-1

前两天miari群里发布了新的mirai-api-http 1.9.0 。 想尝鲜试一下。结果一启动报错。“给定关键字不在字典中”。

资源未释放

public Task<ImageMessage> UploadPictureAsync(PictureTarget type, string imagePath)
{
InternalSessionInfo session = SafeGetSession();
return InternalUploadPictureAsync(session, (UploadTarget)(int)type, new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read));
}

通过 UploadPictureAsync(PictureTarget type, string imagePath) 上传图片后创建的流未被释放

如何获取消息id?

当自己发送消息时,消息id是发送消息函数的返回值,但是当我需要引用别人的消息或者撤回别人的消息时需要用到其消息的id要如何获取?

每隔一段时间Bot收到的消息不会触发收到消息的事件

如题,也试过Mirai-Csharp-Example单独运行,刚开始能正常打印消息,隔一段时间后bot收到消息就不能正常打印
MiraiCsharp版本1.0.2.1
MiraiHttp版本1.12.0
Mirai版本2.7M2

注:另一个使用2.3.2Mirai,1.9.7http的bot则无此问题
希望能找出问题并修复,辛苦了

关于实现和操作问题

public partial class Plugin时,如果不继承IGroupMessage,就无法通过AddPluign添加:提示从“BotMirai Plugin"转换为“Miral_CSharp.Plugin. IPlugin",从而无法工作;但在继承后Resharper告诉我Interface member Task bools Mirai_CSharp.Plugin.lPlugin-lGroupMessageEventArgs> .HandieEventi(MiraiHttpSession, IGroupMessageEventArgs)" is not implemented虽然能够运行,但仍是红线。
就个人使用情况看,现在必须手动挂载到指定事件才能够解决。

Logging的用途

现在在services里指定了logger,但是并没有在任何地方使用到
包括基本的信息和错误处理

用Nuget引入的类库疑似缺乏组件

本人使用VS获取了您的Mirai_CSharp类库,发现在实现时无法和例子中一样使用IGroupMessage接口,核对了Github上的代码发现我下载到的类库中不包含Plugin.Interface的整个命名空间,如图所示

Snipaste_2020-09-12_19-15-06

怀疑是bug,望核查

顺便一提,本人虽用C#工作,但是用这个库还是令我大开眼界,学了很多东西才搞清楚用法(假的IT人,Orz

提前为可能因此而造成的误报抱歉_(: 」∠)_

(目前在考虑直接拿这个git上面的代码用,似乎能复制过来用的样子)

获得指定QQ用户的当前等级

我希望能够获得正在加入群聊的QQ用户的当前等级,并用以作为决定是否允许加入群聊的一部分条件。
能否增加获取等级的接口或在加群事件的返回值中取得等级?

使用示例中的程序不能正常连接啊

提示错误:The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: 0 | BytePositionInLine: 0.”

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.