public async Task HandleMessageAsync(IMiraiHttpSession client, IGroupMemberKickedEventArgs e)
        {
            if (!DataBase.me.IsGroupRelated(e.Member.Group.Id))
            {
                return;
            }
            string name   = e.Member.Name;
            long   qq     = e.Member.Id;
            long   gid    = e.Member.Group.Id;
            string gname  = e.Member.Group.Name;
            long   opid   = e.Operator.Id;
            string opname = DataBase.me.getAdminName(opid);

            try
            {
                MainHolder.broadcaster.BroadcastToAdminGroup(new IChatMessage[] {
                    new PlainMessage(name + "被" + opname + "踢出了" + DataBase.me.getGroupName(gid) + "\n已自动拉黑该用户"),
                    new AtMessage(opid)
                });
                DataBase.me.recUserLeave(qq, gid, opid);
                DataBase.me.removeUser(qq, gid);
                DataBase.me.addUserBlklist(qq, "踢出触发的自动拉黑", opid);
            }
            catch (Exception err)
            {
                MainHolder.broadcaster.BroadcastToAdminGroup("[Exception]\n这条消息可能意味着机器人发生了错误。它仍在继续运行,但可能不是很稳定。下面的信息用来帮助鸡蛋定位错误,管理不必在意。\n[已退群的处理]" + err.Message + "\n\n堆栈跟踪:\n" + err.StackTrace);
            }
            return;
        }
Ejemplo n.º 2
0
 public Task HandleMessageAsync(IMiraiHttpSession session, INewFriendApplyEventArgs e)
 {
     _logger.LogWarning($"已自动拒绝加好友请求。来源:{e.FromQQ}");
     return(session.HandleNewFriendApplyAsync(e, FriendApplyAction.Deny, "略略略"));
     // 把整个事件信息直接作为第一个参数即可, 然后根据自己需要选择一个 FriendApplyAction 枚举去处理请求
     // 你也可以暂存 INewFriendApplyEventArgs e, 之后再调用 session 处理
 }
        public async Task <IActionResult> AddGroupMessageHandlerAsync([Required] int robotQQ, CancellationToken token)
        {
            IMiraiHttpSession session = await _robotManager.RetriveSessionAsync(robotQQ, token);

            session.AddPlugin(new GroupMessageHandler());
            return((JsonResult)ResponseModel.CreateSuccess());
        }
Ejemplo n.º 4
0
        private async Task <IMiraiHttpSession> InternalRetriveSessionAsync(long robotQQ, CancellationToken token)
        {
            try
            {
                if (_robotScopes.TryGetValue(robotQQ, out IServiceScope? dualcheck))
                {
                    return(dualcheck.ServiceProvider.GetRequiredService <IMiraiHttpSession>());
                }
                IServiceScope scope = _services.CreateScope();
                try
                {
                    IMiraiHttpSession session = scope.ServiceProvider.GetRequiredService <IMiraiHttpSession>();
                    await session.ConnectAsync(robotQQ, token).ConfigureAwait(false);

                    _robotScopes[robotQQ] = scope;
                    return(session);
                }
                catch
                {
                    scope.Dispose();
                    throw;
                }
            }
            finally
            {
                _robotInitTasks.TryRemove(robotQQ, out _);
            }
        }
Ejemplo n.º 5
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, IFriendMessageEventArgs e)
        {
            if (!CheckPreconditions(e.Sender))
            {
                return;
            }
            LogHelper.WriteInfoLog($"收到来自{e.Sender.Id}的私聊消息");

            int  quoteId  = (e.Chain[0] as SourceMessage).Id;
            bool isHandle = await MessageHandler.HandleMesage(e.Chain.ToOnionsMessages(e.Sender.Id, e.Sender.Name), null, async outMsg =>
            {
                if (outMsg != null)
                {
                    int iRevokeTime = outMsg.RevokeTime;
                    var msg         = await outMsg.ToMiraiApiHttpMessages(session, UploadTarget.Friend);
                    _ = session.SendFriendMessageAsync(e.Sender.Id, msg, outMsg.Reply ? quoteId : null).ContinueWith(async sendedCallBack =>
                    {
                        if (iRevokeTime > 0)
                        {
                            await Task.Delay(1000 * iRevokeTime);
                            _ = session.RevokeMessageAsync(sendedCallBack.Result);
                        }
                    });
                }
            });

            e.BlockRemainingHandlers = isHandle;
        }
Ejemplo n.º 6
0
 public Task HandleMessageAsync(IMiraiHttpSession session, IGroupMemberKickedEventArgs e)
 {
     if (!CheckPreconditions(e.Member) || !BotInfo.SendMemberBeKickedMessage)
     {
         return(Task.CompletedTask);
     }
     return(session.SendGroupMessageAsync(e.Member.Group.Id, ReplaceMessage(session.GetMessageChainBuilder(), BotInfo.MemberBeKickedMessage, e.Member, e.Operator)));
 }
Ejemplo n.º 7
0
        private async Task SendPictureAsync2(IMiraiHttpSession session, string path) // 发图, 不同的是使用 IMessageChainBuilder 构造消息链
        {
            IImageMessage msg = await session.UploadPictureAsync(UploadTarget.Group, path);

            Builders.IMessageChainBuilder builder = session.GetMessageChainBuilder();
            builder.Add(msg);
            await session.SendGroupMessageAsync(0, builder); // 自己填群号, 一般由 IGroupMessageEventArgs 提供
        }
Ejemplo n.º 8
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, INewFriendApplyEventArgs e)
        {
            await session.HandleNewFriendApplyAsync(e, FriendApplyAction.Deny, "略略略");

            // 把整个事件信息直接作为第一个参数即可, 然后根据自己需要选择一个 FriendApplyAction 枚举去处理请求
            // 你也可以暂存 INewFriendApplyEventArgs e, 之后再调用 session 处理
            e.BlockRemainingHandlers = false;
        }
        public override async Task HandleMessageAsync(IMiraiHttpSession session, IBotInvitedJoinGroupEventArgs e)
        {
            await session.HandleBotInvitedJoinGroupAsync(e, GroupApplyActions.Allow, "略略略"); // 在这个事件下, 只有 GroupApplyActions.Allow 和

            //                 GroupApplyActions.Deny 有效
            // 把整个事件信息直接作为第一个参数即可, 然后根据自己需要选择一个 GroupApplyActions 枚举去处理请求
            // 你也可以暂存 IGroupApplyEventArgs e, 之后再调用session处理
            e.BlockRemainingHandlers = false;
        }
Ejemplo n.º 10
0
        public async Task HandleMessageAsync2(IMiraiHttpSession session, IFriendMessageEventArgs e) // 法2: 使用 params IMessageBase[]
        {
            IChatMessage plain1 = new PlainMessage($"收到了来自{e.Sender.Name}({e.Sender.Remark})[{e.Sender.Id}]的私聊消息:{string.Join(null, (IEnumerable<IChatMessage>)e.Chain)}");
            //                                                /   好友昵称  /  /    好友备注    /  /  好友QQ号  /                                                        / 消息链 /
            IChatMessage plain2 = new PlainMessage("嘤嘤嘤");                                      // 在下边的 SendFriendMessageAsync, 你可以串起n个 IChatMessage
            await session.SendFriendMessageAsync(e.Sender.Id, plain1 /*, plain2, /* etc... */); // 向消息来源好友异步发送由以上chain表示的消息

            e.BlockRemainingHandlers = false;                                                   // 不阻断消息传递。如需阻断请返回true
        }
Ejemplo n.º 11
0
        public async Task HandleMessageAsync2(IMiraiHttpSession session, IGroupMessageEventArgs e) // 法2: 使用 params IMessageBase[]
        {
            IChatMessage plain1 = new PlainMessage($"收到了来自{e.Sender.Name}[{e.Sender.Id}]{{{e.Sender.Permission}}}的群消息:{string.Join(null, (IEnumerable<IChatMessage>)e.Chain)}");
            //                                                / 发送者群名片 /  / 发送者QQ号 /   /   发送者在群内权限   /                                                       / 消息链 /
            IChatMessage plain2 = new PlainMessage("QAQ");                                           // 在下边的 SendGroupMessageAsync, 你可以串起n个 IMessageBase
            await session.SendGroupMessageAsync(e.Sender.Group.Id, plain1 /*, plain2, /* etc... */); // 向消息来源群异步发送由以上chain表示的消息

            e.BlockRemainingHandlers = false;                                                        // 不阻断消息传递。如需阻断请返回true
        }
Ejemplo n.º 12
0
        public async Task HandleMessageAsync(IMiraiHttpSession client, ITempMessageEventArgs e)
        {
            MsgReplyTemp r = new MsgReplyTemp()
            {
                fromGroup = e.Sender.Group.Id, qq = e.Sender.Id
            };

            ProcessMessage(r, e.Chain);
            return;
        }
Ejemplo n.º 13
0
        private async Task SendPictureAsync(IMiraiHttpSession session, string path) // 发图
        {
            // 你也可以使用另一个重载 UploadPictureAsync(PictureTarget, Stream)
            // 当 mirai-api-http 在v1.7.0以下时将使用本地的HttpListener做图片中转
            // UploadTarget.Friend 对应 IMiraiSession.SendFriendMessageAsync
            IImageMessage msg = await session.UploadPictureAsync(UploadTarget.Group, path);

            IChatMessage[] chain = new IChatMessage[] { msg }; // 数组里边可以加上更多的 IMessageBase, 以此达到例如图文并发的情况
            await session.SendGroupMessageAsync(0, chain);     // 自己填群号, 一般由 IGroupMessageEventArgs 提供
        }
Ejemplo n.º 14
0
        public async Task HandleMessageAsync(IMiraiHttpSession client, IFriendMessageEventArgs e)
        {
            MsgReplyFriend r = new MsgReplyFriend()
            {
                qq = e.Sender.Id
            };

            ProcessMessage(r, e.Chain);
            return;
        }
        public async Task HandleMessageAsync(IMiraiHttpSession session, IGroupMessageEventArgs e) // 法3: 使用 IMessageBuilder
        {
            IMessageChainBuilder builder = session.GetMessageChainBuilder();

            builder.AddPlainMessage($"收到了来自{e.Sender.Name}[{e.Sender.Id}]{{{e.Sender.Permission}}}的群消息:{string.Join(null, (IEnumerable<IChatMessage>)e.Chain)}");
            //                                 / 发送者群名片 /  / 发送者QQ号 /   /   发送者在群内权限   /                                                       / 消息链 /
            // builder.AddPlainMessage("QAQ").AddPlainMessage("OvO")/* .AddAtMessage(123456) etc... */;
            await session.SendGroupMessageAsync(e.Sender.Group.Id, builder /*, plain2, /* etc... */); // 向消息来源群异步发送由以上chain表示的消息

            // e.BlockRemainingHandlers = true; // 默认不阻断消息传递。如需阻断请删除注释
        }
Ejemplo n.º 16
0
        public async Task HandleMessageAsync3(IMiraiHttpSession session, IFriendMessageEventArgs e) // 法3: 使用 params IMessageBase[]
        {
            Builders.IMessageChainBuilder builder = session.GetMessageChainBuilder();
            builder.AddPlainMessage($"收到了来自{e.Sender.Name}({e.Sender.Remark})[{e.Sender.Id}]的私聊消息:{string.Join(null, (IEnumerable<IChatMessage>)e.Chain)}");
            //                                 /   好友昵称  /  /    好友备注    /  /  好友QQ号  /                                                        / 消息链 /
            // builder.AddPlainMessage("QAQ").AddPlainMessage("QwQ")/* .AddAtMessage(123456) etc... */;
            // 你甚至可以一开始 new MessageBuilder() 的时候就开始 Chaining
            await session.SendFriendMessageAsync(e.Sender.Id, builder); // 向消息来源群异步发送由以上chain表示的消息

            e.BlockRemainingHandlers = false;                           // 不阻断消息传递。如需阻断请返回true
        }
Ejemplo n.º 17
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, IFriendMessageEventArgs e) // 法1: 使用 IMessageBase[]
        {
            IChatMessage[] chain = new IChatMessage[]
            {
                new PlainMessage($"收到了来自{e.Sender.Name}({e.Sender.Remark})[{e.Sender.Id}]的私聊消息:{string.Join(null, (IEnumerable<IChatMessage>)e.Chain)}")
                //                          /   好友昵称  /  /    好友备注    /  /  好友QQ号  /                                                        / 消息链 /
                // 你还可以在这里边加入更多的 IMessageBase
            };
            await session.SendFriendMessageAsync(e.Sender.Id, chain); // 向消息来源好友异步发送由以上chain表示的消息

            e.BlockRemainingHandlers = false;                         // 不阻断消息传递。如需阻断请返回true
        }
Ejemplo n.º 18
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, IGroupMessageEventArgs e) // 法1: 使用 IMessageBase[]
        {
            // 临时消息和群消息一致, 不多写例子了
            IChatMessage[] chain = new IChatMessage[]
            {
                new PlainMessage($"收到了来自{e.Sender.Name}[{e.Sender.Id}]{{{e.Sender.Permission}}}的群消息:{string.Join(null, (IEnumerable<IChatMessage>)e.Chain)}")
                //                          / 发送者群名片 /  / 发送者QQ号 /   /   发送者在群内权限   /                                                       / 消息链 /
                // 你还可以在这里边加入更多的 IMessageBase
            };
            await session.SendGroupMessageAsync(e.Sender.Group.Id, chain); // 向消息来源群异步发送由以上chain表示的消息

            e.BlockRemainingHandlers = false;                              // 不阻断消息传递。如需阻断请返回true
        }
Ejemplo n.º 19
0
        public static async Task Main()
        {
            // 一套能用的框架, 必须要注册至少一个 Invoker, Parser, Client 和 Handler
            // Invoker 负责消息调度
            // Parser 负责解析消息到具体接口以便调度器调用相关 Handler 下的处理方法
            // Client 负责收发原始数据
            IServiceProvider services = new ServiceCollection().AddMiraiBaseFramework() // 表示使用基于基础框架的构建器
                                        .AddHandler <MiraiPlugin>()                     // 虽然可以把 HttpApiPlugin 作为泛型参数塞入, 但不建议这么做
                                        .Services
                                        .AddDefaultMiraiHttpFramework()                 // 表示使用 mirai-api-http 实现的构建器
                                        .ResolveParser <DynamicPlugin>()                // 只提前解析 DynamicPlugin 将要用到的消息解析器
                                        .AddInvoker <MiraiHttpMessageHandlerInvoker>()  // 使用默认的调度器
                                        .AddHandler <HttpApiPlugin>()                   // 可以如此添加更多消息处理器
                                        .AddClient <MiraiHttpSession>()                 // 使用默认的客户端
                                        .Services
                                                                                        // 由于 MiraiHttpSession 使用 IOptions<MiraiHttpSessionOptions>, 其作为 Singleton 被注册
                                                                                        // 配置此项将配置基于此 IServiceProvider 全局的连接配置
                                                                                        // 如果你想一个作用域一个配置的话
                                                                                        // 自行做一个实现类, 继承MiraiHttpSession, 构造参数中使用 IOptionsSnapshot<MiraiHttpSessionOptions>
                                                                                        // 并将其传递给父类的构造参数
                                                                                        // 然后在每一个作用域中!先!配置好 IOptionsSnapshot<MiraiHttpSessionOptions>, 再尝试获取 IMiraiHttpSession
                                        .Configure <MiraiHttpSessionOptions>(options =>
            {
                options.Host    = "域名/IP";
                options.Port    = 12345;                                                 // 端口
                options.AuthKey = "00000000000000000000000000000000";                    // 凭据
            })
                                        .AddLogging()
                                        .BuildServiceProvider();
            IServiceScope scope = services.CreateScope();

            await using var x = (IAsyncDisposable)scope;
            //await using AsyncServiceScope scope = services.CreateAsyncScope(); // 自 .NET 6.0 起才可以如此操作代替上边两句
            services = scope.ServiceProvider;
            IMiraiHttpSession  session      = services.GetRequiredService <IMiraiHttpSession>(); // 大部分服务都基于接口注册, 请使用接口作为类型解析
            DynamicPlugin      plugin       = new DynamicPlugin();
            PluginResistration resistration = session.AddPlugin(plugin);                         // 实时添加
            await session.ConnectAsync(0);                                                       // 填入期望连接到的机器人QQ号

            while (true)
            {
                if (Console.ReadLine() == "exit")
                {
                    resistration.Dispose(); // 实时移除
                    break;
                }
            }
        }
Ejemplo n.º 20
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, IGroupMessageEventArgs e)
        {
            if (!CheckPreconditions(e.Sender))
            {
                return;
            }
            LogHelper.WriteInfoLog($"收到来自{e.Sender.Id}的群消息");

            int quoteId = (e.Chain[0] as SourceMessage).Id;

            for (int i = 0; i < e.Chain.Length; i++)
            {
                //获取@群名片
                if (e.Chain[i] is IAtMessage atMsg)
                {
                    IGroupMemberInfo[] groupMemberInfos = await session.GetGroupMemberListAsync(e.Sender.Group.Id);

                    IGroupMemberInfo targetQQ = groupMemberInfos.Where(m => m.Id == atMsg.Target).FirstOrDefault();
                    string           nickName = targetQQ?.Name;
                    e.Chain[i] = new AtMessage(atMsg.Target, nickName);
                }
            }

            bool isHandle = await MessageHandler.HandleMesage(e.Chain.ToOnionsMessages(e.Sender.Id, e.Sender.Name), e.Sender.Group.Id, async outMsg =>
            {
                if (outMsg != null)
                {
                    int iRevokeTime = outMsg.RevokeTime;
                    var msg         = await outMsg.ToMiraiApiHttpMessages(session, UploadTarget.Group);
                    _ = session.SendGroupMessageAsync(e.Sender.Group.Id, msg, outMsg.Reply ? quoteId : null).ContinueWith(async sendedCallBack =>
                    {
                        if (iRevokeTime > 0)
                        {
                            await Task.Delay(1000 * iRevokeTime);
                            _ = session.RevokeMessageAsync(sendedCallBack.Result);
                        }
                    });
                }
            });

            e.BlockRemainingHandlers = isHandle;
        }
Ejemplo n.º 21
0
        public async Task HandleMessageAsync(IMiraiHttpSession client, IFriendMessageEventArgs e)
        {
            _session = client;
            var message = GetMessage(e.Chain, out var command);

            try
            {
                //mirai不支持获取单个用户信息,所以在消息收到时进行添加
                UserManager.Add(new QQSourceInfo
                {
                    Id   = e.Sender.Id,
                    Nick = e.Sender.Name,
                });
                await CommandCenter.Execute(command, message, Core.PlatformModel.MessageSourceType.Friend, qqNo : e.Sender.Id);
            }
            catch (Exception ex)
            {
                AnsiConsole.MarkupLine($"[red]{ex.Message}{Environment.NewLine}{ex.StackTrace}[/]");
            }
        }
Ejemplo n.º 22
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, IDisconnectedEventArgs e)
        {
            // e.Exception: 引发掉线的响应异常, 按需处理
            while (true)
            {
                try
                {
                    await session.ConnectAsync(e.LastConnectedQQNumber);

                    e.BlockRemainingHandlers = true;
                    break;
                }
                catch (ObjectDisposedException) // session 已被释放
                {
                    break;
                }
                catch (Exception)
                {
                    await Task.Delay(1000);
                }
            }
        }
        public async Task HandleMessageAsync(IMiraiHttpSession client, IGroupMemberPositiveLeaveEventArgs e)
        {
            if (!DataBase.me.IsGroupRelated(e.Member.Group.Id))
            {
                return;
            }
            string name  = e.Member.Name;
            long   qq    = e.Member.Id;
            long   gid   = e.Member.Group.Id;
            string gname = e.Member.Group.Name;

            try
            {
                MainHolder.broadcaster.BroadcastToAdminGroup(name + "退出了" + DataBase.me.getGroupName(gid) + "\n已删除该用户");
                DataBase.me.recUserLeave(qq, gid, null);
                DataBase.me.removeUser(qq, gid);
            }
            catch (Exception err)
            {
                MainHolder.broadcaster.BroadcastToAdminGroup("[Exception]\n这条消息可能意味着机器人发生了错误。它仍在继续运行,但可能不是很稳定。下面的信息用来帮助鸡蛋定位错误,管理不必在意。\n[已退群的处理]" + err.Message + "\n\n堆栈跟踪:\n" + err.StackTrace);
            }
            return;
        }
        public async Task HandleMessageAsync(IMiraiHttpSession session, IDisconnectedEventArgs message)
        {
            _logger.LogWarning(message.Exception, $"连接被断开。上一次连接的QQ号为:{message.LastConnectedQQNumber}");
            while (!session.Connected) // 防止以前的handler未能正确阻断消息传递
            {
                try
                {
                    await session.ConnectAsync(message.LastConnectedQQNumber);

                    message.BlockRemainingHandlers = true;
                    _logger.LogInformation($"重连成功");
                    break;
                }
                catch (ObjectDisposedException)
                {
                    break;
                }
                catch (Exception e)
                {
                    _logger.LogError(e, $"重连失败。上一次连接的QQ号为:{message.LastConnectedQQNumber}");
                    await Task.Delay(1000);
                }
            }
        }
Ejemplo n.º 25
0
        public async Task HandleMessageAsync(IMiraiHttpSession session, IGroupApplyEventArgs e)
        {
            if (!DataBase.me.IsGroupRelated(e.FromGroup))
            {
                return;
            }
            if (DataBase.me.isUserBlacklisted(e.FromQQ))
            {
                MainHolder.broadcaster.BroadcastToAdminGroup("入群的用户 " + e.NickName + "(" + e.FromQQ + ") 存在于黑名单中,自动拒绝。");
                await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "您被设置不能加入任何粉丝群。");

                return;
            }
            switch (DataBase.me.isUserTrusted(e.FromQQ))
            {
            case 1:
                DataBase.me.removeUserTrustlist(e.FromQQ);
                MainHolder.broadcaster.BroadcastToAdminGroup("入群的用户 " + e.NickName + "(" + e.FromQQ + ") 受到单次信任,同意入群。\n该次信任已被移除。");
                goto case 9;    //显式允许直接进入下一个case

            case 0:
                MainHolder.broadcaster.BroadcastToAdminGroup("入群的用户 " + e.NickName + "(" + e.FromQQ + ") 受到永久信任,同意入群。");
                goto case 9;    //显式允许直接进入下一个case

            case 9:
                await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Allow);

                return;
            }
            int qqlevel = -1;

            if (e.FromGroup != 964206367)
            {
                qqlevel = ThirdPartAPIs.getQQLevel(e.FromQQ, 2);
                if (qqlevel < 0)
                {
                    Thread.Sleep(2000);
                    qqlevel = ThirdPartAPIs.getQQLevel(e.FromQQ, 2);
                }
                if (qqlevel < 0)
                {
                    MainHolder.broadcaster.BroadcastToAdminGroup("入群的用户 " + e.NickName + "(" + e.FromQQ + ") 等级查询失败(try3,2s,try3),已提示重新申请");
                    await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "等级查询失败,请重新申请入群");

                    return;
                }
                else
                if (qqlevel < 16)
                {
                    MainHolder.broadcaster.BroadcastToAdminGroup("入群的用户 " + e.NickName + "(" + e.FromQQ + ") 等级过低(" + qqlevel + "<16), 拒绝");
                    await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "您的QQ等级过低, 如有疑问请联系管理");

                    return;
                }
            }

            if (DataBase.me.isCrewGroup(e.FromGroup))
            {                                               //是舰长群
                CrewChecker cr = new CrewChecker();
                if (DataBase.me.isUserBoundedUID(e.FromQQ)) //舰长绑定
                {
                    var uid = DataBase.me.getUserBoundedUID(e.FromQQ);
                    if (DataBase.me.isBiliUserGuard(uid))
                    {
                        await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Allow);

                        MainHolder.broadcaster.BroadcastToAdminGroup(e.FromQQ + "\n!正在加入舰长群(" + qqlevel + ">=16)\n是舰长,同意");
                    }
                    else
                    {
                        await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "没有您的大航海数据,如有疑问请联系管理。");

                        MainHolder.broadcaster.BroadcastToAdminGroup(e.FromQQ + "\n!正在加入舰长群\n不是舰长,拒绝");
                    }
                }
                else
                {
                    await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "您的QQ没有绑定任何UID,如有疑问请联系管理。");

                    MainHolder.broadcaster.BroadcastToAdminGroup(e.FromQQ + "\n!正在加入舰长群\n未知QQ,拒绝");
                }
                return;
            }
            else
            {
                var groups = DataBase.me.whichGroupsAreTheUserIn(e.FromQQ);
                if (groups.Count > 1)
                {
                    string gps = "";
                    foreach (long group in groups)
                    {
                        gps += DataBase.me.getGroupName(group) + "(" + group + ")\n";
                    }
                    MainHolder.broadcaster.BroadcastToAdminGroup(e.NickName + "(" + e.FromQQ + ") 加入群  " +
                                                                 e.FromGroupName + "(" + e.FromGroup + ") \n,自动拒绝。\n该用户同时加入以下群聊:\n" + gps);
                    await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "已加入其它粉丝群 如有疑问请联系管理");

                    return;
                }
            }

            {
                //await MainHolder.session.HandleGroupApplyAsync(e, GroupApplyActions.Allow);
                MainHolder.broadcaster.BroadcastToAdminGroup(e.FromQQ + "\n不在黑名单,等级条件满足(" + qqlevel + ">=16)\n等待人工处理");
                return;
            }
        }
        public static async Task <IChatMessage[]> ToMiraiApiHttpMessages(this IGreenOnionsMessages greenOnionsMessage, IMiraiHttpSession session, UploadTarget uploadTarget)
        {
            List <IChatMessage> miraiApiHttpMessages = new List <IChatMessage>();
            List <Mirai.CSharp.HttpApi.Models.ChatMessages.ForwardMessageNode> nodes = new List <Mirai.CSharp.HttpApi.Models.ChatMessages.ForwardMessageNode>();

            for (int i = 0; i < greenOnionsMessage.Count; i++)
            {
                if (greenOnionsMessage[i] is IGreenOnionsTextMessage txtMsg)
                {
                    miraiApiHttpMessages.Add(new Mirai.CSharp.HttpApi.Models.ChatMessages.PlainMessage(txtMsg.Text));
                }
                else if (greenOnionsMessage[i] is IGreenOnionsImageMessage imgMsg)
                {
                    if (!string.IsNullOrEmpty(imgMsg.Url))
                    {
                        string url  = null;
                        string path = null;
                        if (File.Exists(imgMsg.Url))
                        {
                            path = imgMsg.Url;
                        }
                        else
                        {
                            url = imgMsg.Url;
                        }
                        miraiApiHttpMessages.Add(new Mirai.CSharp.HttpApi.Models.ChatMessages.ImageMessage(null, url, path));
                    }
                    else if (!string.IsNullOrEmpty(imgMsg.Base64Str))
                    {
                        using (MemoryStream ms = imgMsg.MemoryStream)
                        {
                            miraiApiHttpMessages.Add(await session.UploadPictureAsync(uploadTarget, ms));
                        }
                    }
                }
                else if (greenOnionsMessage[i] is IGreenOnionsAtMessage atMsg)
                {
                    if (atMsg.AtId == -1)
                    {
                        miraiApiHttpMessages.Add(new Mirai.CSharp.HttpApi.Models.ChatMessages.AtAllMessage());
                    }
                    else
                    {
                        miraiApiHttpMessages.Add(new Mirai.CSharp.HttpApi.Models.ChatMessages.AtMessage(atMsg.AtId));
                    }
                }
                else if (greenOnionsMessage[i] is IGreenOnionsForwardMessage forwardMsg)
                {
                    for (int j = 0; j < forwardMsg.ItemMessages.Count; j++)
                    {
                        Mirai.CSharp.HttpApi.Models.ChatMessages.ForwardMessageNode node = new Mirai.CSharp.HttpApi.Models.ChatMessages.ForwardMessageNode()
                        {
                            Id       = i * j + j,
                            Name     = forwardMsg.ItemMessages[j].NickName,
                            QQNumber = forwardMsg.ItemMessages[j].QQid,
                            Time     = DateTime.Now,
                            Chain    = (await ToMiraiApiHttpMessages(forwardMsg.ItemMessages[j].itemMessage, session, uploadTarget)).Select(msg => msg as Mirai.CSharp.HttpApi.Models.ChatMessages.IChatMessage).ToArray(),
                        };
                        nodes.Add(node);
                    }
                }
            }
            if (nodes.Count > 0)
            {
                Mirai.CSharp.HttpApi.Models.ChatMessages.ForwardMessage forwardMessage = new Mirai.CSharp.HttpApi.Models.ChatMessages.ForwardMessage(nodes.ToArray());
                miraiApiHttpMessages.Add(forwardMessage);
            }
            return(miraiApiHttpMessages.ToArray());
        }
 public async Task HandleMessageAsync(IMiraiHttpSession session, IGroupApplyEventArgs e)
 {
     // 把整个事件信息直接作为第一个参数即可, 然后根据自己需要选择一个 GroupApplyActions 枚举去处理请求
     // 你也可以暂存 IGroupApplyEventArgs e, 之后再调用session处理
     await session.HandleGroupApplyAsync(e, GroupApplyActions.Deny, "略略略");
 }
Ejemplo n.º 28
0
        static async Task Main(string[] args)
        {
            Options opt = null;

            Parser.Default.ParseArguments <Options>(args).WithParsed <Options>(o =>
            {
                opt = o;
            });

            var bot = new Bot();
            IServiceProvider services = new ServiceCollection().AddMiraiBaseFramework() // 表示使用基于基础框架的构建器
                                        .AddHandler <Bot>(p => bot, ServiceLifetime.Singleton)
                                        .Services
                                        .AddDefaultMiraiHttpFramework()                // 表示使用 mirai-api-http 实现的构建器
                                        .ResolveParser <Bot>(ServiceLifetime.Singleton)
                                        .AddInvoker <MiraiHttpMessageHandlerInvoker>() // 使用默认的调度器
                                        .AddClient <MiraiHttpSession>()                // 使用默认的客户端
                                        .Services
                                                                                       // 由于 MiraiHttpSession 使用 IOptions<MiraiHttpSessionOptions>, 其作为 Singleton 被注册
                                                                                       // 配置此项将配置基于此 IServiceProvider 全局的连接配置
                                                                                       // 如果你想一个作用域一个配置的话
                                                                                       // 自行做一个实现类, 继承MiraiHttpSession, 构造参数中使用 IOptionsSnapshot<MiraiHttpSessionOptions>
                                                                                       // 并将其传递给父类的构造参数
                                                                                       // 然后在每一个作用域中!先!配置好 IOptionsSnapshot<MiraiHttpSessionOptions>, 再尝试获取 IMiraiHttpSession
                                        .Configure <MiraiHttpSessionOptions>(options =>
            {
                options.Host    = "127.0.0.1";
                options.Port    = 8080;        // 端口
                options.AuthKey = opt.AuthKey; // 凭据
            })
                                        .AddLogging()
                                        .BuildServiceProvider();
            IServiceScope scope = services.CreateScope();

            await using var x = (IAsyncDisposable)scope;
            //await using AsyncServiceScope scope = services.CreateAsyncScope(); // 自 .NET 6.0 起才可以如此操作代替上边两句
            services = scope.ServiceProvider;
            IMiraiHttpSession session = services.GetRequiredService <IMiraiHttpSession>(); // 大部分服务都基于接口注册, 请使用接口作为类型解析

            //session.AddPlugin(bot); // 实时添加
            bot.SetSession(session);
            await session.ConnectAsync(opt.QQ); // 填入期望连接到的机器人QQ号

            await bot.Start();

            while (true)
            {
                var readline = await Console.In.ReadLineAsync();

                if (readline == "exit")
                {
                    return;
                }
                else if (readline.StartsWith("notice ", StringComparison.OrdinalIgnoreCase))
                {
                    var message = $"[通知]{readline.Substring(7)}";
                    var groups  = GensouSakuya.QQBot.Core.QQManager.GroupMemberManager.GroupMembers.Values
                                  .Select(p => p.GroupId).Distinct().ToList();
                    groups.ForEach(p => { session.SendGroupMessageAsync(p, new PlainMessage(message)); });
                }
                else if (readline.StartsWith("togroup ", StringComparison.OrdinalIgnoreCase))
                {
                    var splited = readline.Split(" ");
                    if (!long.TryParse(splited[1], out var groupNo))
                    {
                        continue;
                    }
                    var message = string.Join(" ", splited.Skip(2));
                    await session.SendGroupMessageAsync(groupNo, new PlainMessage(message));
                }
                else if (readline.Equals("save", StringComparison.OrdinalIgnoreCase))
                {
                    await DataManager.Save();
                }
                else if (readline.Equals("load", StringComparison.OrdinalIgnoreCase))
                {
                    await DataManager.Load();
                }
            }
        }
        public async Task HandleMessageAsync(IMiraiHttpSession client, IGroupMemberJoinedEventArgs e)
        {
            if (!DataBase.me.IsGroupRelated(e.Member.Group.Id))
            {
                return;
            }
            string usname  = e.Member.Name;
            long   qq      = e.Member.Id;
            long   groupId = e.Member.Group.Id;
            string gname   = DataBase.me.getGroupName(groupId);

            gname =
                gname == "UNDEFINED_IN_DATABASE"
                ? e.Member.Group.Name : gname;
            try
            {
                if (DataBase.me.isUserBlacklisted(qq))
                {
                    MainHolder.broadcaster.BroadcastToAdminGroup("入群的用户 " + usname + "(" + qq + ") 存在于黑名单中,请三思!");
                }
                if (DataBase.me.whichGroupsAreTheUserIn(qq).Count > 1)
                {
                    List <long> groups_in = DataBase.me.whichGroupsAreTheUserIn(qq);
                    if (groups_in.Count > 1)
                    {
                        string gps = "";
                        foreach (long group in groups_in)
                        {
                            gps += DataBase.me.getGroupName(group) + "(" + group + ")\n";
                        }
                        MainHolder.broadcaster.BroadcastToAdminGroup(usname + "(" + qq + ") 加入群  " +
                                                                     gname + "(" + groupId + ") \n该用户同时加入以下群聊:\n" + gps);
                    }
                }
                if (DataBase.me.isCrewGroup(e.Member.Group.Id))
                {
                    long uid = DataBase.me.getUserBoundedUID(qq);

                    if (uid <= 0)
                    {
                        MainHolder.broadcaster.BroadcastToAdminGroup(usname + "(" + qq + ")加入舰长群  " +
                                                                     gname + "(" + groupId + ") \n[未能验证舰长记录 该用户未绑定UID]");
                        MainHolder.broadcaster.SendToGroup(groupId, "欢迎加入舰长群!\n[未绑定B站账号]");
                        //e.BeingOperateQQ.SendPrivateMessage("欢迎来到舰长群,感谢您对鹿野的支持!\n当前QQ未和Bilibili绑定,可发送#uid [uid]来绑定B站账号。例如:\n#uid 23696210\n不会操作也可以联系鸡蛋🥚");
                    }
                    else
                    {
                        MainHolder.broadcaster.BroadcastToAdminGroup(usname + "(" + qq + ")<舰长> 加入群  " +
                                                                     gname + "(" + groupId + ") \nB站信息:https://space.bilibili.com/" + uid + "\n");
                        PrivMessageSession           psession = PrivMessageSession.openSessionWith((int)uid, MainHolder.biliapi);
                        BiliApi.BiliUser             bu       = BiliApi.BiliUser.getUser((int)uid, MainHolder.biliapi);
                        CrewChecker                  cr       = new CrewChecker();
                        Dictionary <int, CrewMember> crewlist = cr.getAllCrewMembers();
                        CrewMember thismember = crewlist[(int)uid];
                        string     dpword     = "";
                        switch (thismember.level)
                        {
                        case 1:
                            dpword = "总督";
                            break;

                        case 2:
                            dpword = "提督";
                            break;

                        case 3:
                            dpword = "舰长";
                            break;
                        }
                        MainHolder.broadcaster.SendToGroup(groupId, "欢迎" + dpword + "<" + bu.name + ">加入舰长群!");
                        IGroupMemberCardInfo iginfo = new GroupMemberCardInfo(dpword + " " + bu.name, null);
                        await MainHolder.session.ChangeGroupMemberInfoAsync(qq, groupId, iginfo);

                        MainHolder.broadcaster.SendToQQ(qq, "欢迎来到舰长群,感谢您对奶狗狗的支持!请认准鹿野QQ(1249695750),可通过舰长群私聊鹿野获取好友位哦\n您的QQ号已和Bilibili账号<" + bu.name + ">绑定,如有疑问请联系鸡蛋🥚(这套系统的开发者,QQ号1250542735)");
                        psession.sendMessage("您已经成功加入了舰长群。感谢您对大总攻(XNG)的支持!");
                    }
                }
                else
                {
                    MainHolder.broadcaster.BroadcastToAdminGroup(usname + "加入了" + gname + "\n已建立用户信息");
                }
                DataBase.me.addUser(qq, groupId, usname);
            }
            catch (Exception err)
            {
                MainHolder.broadcaster.BroadcastToAdminGroup("[Exception]\n这条消息可能意味着机器人发生了错误。它仍在继续运行,但可能不是很稳定。下面的信息用来帮助鸡蛋定位错误,管理不必在意。\n[已入群的处理]" + err.Message + "\n\n堆栈跟踪:\n" + err.StackTrace);
            }
            return;
        }
 public virtual Task HandleMessageAsync(IMiraiHttpSession session, IMiraiHttpMessage message)
 {
     return(base.HandleMessageAsync(client: session, (TMessage)message));
 }