コード例 #1
0
ファイル: Surprise.cs プロジェクト: DeepOceanSoft/AntiRainBot
        public async ValueTask RollWife(GroupMessageEventArgs eventArgs)
        {
            var(apiStatus, memberList) = await eventArgs.SourceGroup.GetGroupMemberList();

            if (apiStatus.RetCode != ApiStatusType.OK)
            {
                Log.Error("api错误", $"api return {apiStatus}");
                return;
            }

            //删除自身和发送者
            memberList.RemoveAll(i => i.UserId == eventArgs.Sender);
            memberList.RemoveAll(i => i.UserId == eventArgs.LoginUid);

            if (memberList.Count == 0)
            {
                await eventArgs.Reply("群里没人是你的老婆");
            }

            await eventArgs.Reply("10秒后我将at一位幸运群友成为你的老婆\r\n究竟是谁会这么幸运呢");

            await Task.Delay(10000);

            var rd = new Random();
            await eventArgs.Reply(CQCodes.CQAt(memberList[rd.Next(0, memberList.Count - 1)].UserId),
                                  "\r\n恭喜成为",
                                  CQCodes.CQAt(eventArgs.Sender),
                                  "的老婆 ~");
        }
コード例 #2
0
ファイル: BotUtils.cs プロジェクト: DeepOceanSoft/AntiRainBot
        /// <summary>
        /// 数据库发生错误时的消息提示
        /// </summary>
        public static async ValueTask DatabaseFailedTips(GroupMessageEventArgs groupEventArgs)
        {
            await groupEventArgs.SourceGroup.SendGroupMessage(CQCodes.CQAt(groupEventArgs.Sender.Id),
                                                              "\r\nERROR",
                                                              "\r\n数据库错误");

            Log.Error("database", "database error");
        }
コード例 #3
0
 /// <summary>
 /// 私聊处理
 /// </summary>
 public static async ValueTask PrivateMessageParse(object sender, PrivateMessageEventArgs privateMessage)
 {
     //简单的机器人响应
     if (privateMessage.Message.RawText.Equals("在"))
     {
         await privateMessage.Sender
         .SendPrivateMessage(CQCodes
                             .CQImage("https://i.loli.net/2020/11/02/2OgZ1M6YNV5kntS.gif"));
     }
 }
コード例 #4
0
        private static async ValueTask GetLiveStatus(SoraApi soraApi, long biliUser, List <long> groupId,
                                                     SubscriptionDBHelper dbHelper)
        {
            LiveInfo      live;
            UserSpaceInfo biliUserInfo;

            //获取数据
            try
            {
                biliUserInfo = UserApis.GetLiveRoomInfo(biliUser);
                live         = LiveAPIs.GetLiveRoomInfo(biliUserInfo.LiveRoomInfo.ShortId);
            }
            catch (Exception e)
            {
                Log.Error("获取直播状态时发生错误", Log.ErrorLogBuilder(e));
                return;
            }

            //需要更新数据的群
            Dictionary <long, LiveStatusType> updateDict = groupId
                                                           .Where(gid => dbHelper.GetLastLiveStatus(gid, biliUser) !=
                                                                  live.LiveStatus)
                                                           .ToDictionary(gid => gid, _ => live.LiveStatus);

            //更新数据库
            foreach (var status in updateDict)
            {
                if (!dbHelper.UpdateLiveStatus(status.Key, biliUser, live.LiveStatus))
                {
                    Log.Error("Database", "更新直播订阅数据失败");
                }
            }

            //需要消息提示的群
            var targetGroup = updateDict.Where(group => group.Value == LiveStatusType.Online)
                              .Select(group => group.Key)
                              .ToList();

            if (targetGroup.Count == 0)
            {
                return;
            }
            //构建提示消息
            MessageBody message = $"{biliUserInfo.Name} 正在直播!\r\n{biliUserInfo.LiveRoomInfo.Title}" +
                                  CQCodes.CQImage(biliUserInfo.LiveRoomInfo.CoverUrl) +
                                  $"直播间地址:{biliUserInfo.LiveRoomInfo.LiveUrl}";

            foreach (var gid in targetGroup)
            {
                Log.Info("直播订阅", $"获取到{biliUserInfo.Name}正在直播,向群[{gid}]发送动态信息");
                await soraApi.SendGroupMessage(gid, message);
            }
        }
コード例 #5
0
        /// <summary>
        /// 权限检查/越权警告
        /// </summary>
        internal static async Task <bool> AuthCheck(this GroupMessageEventArgs eventArgs, string cmdTypeStr)
        {
            if (eventArgs.IsAdminSession())
            {
                return(true);
            }
            else
            {
                await eventArgs.SourceGroup.SendGroupMessage(CQCodes.CQAt(eventArgs.Sender.Id),
                                                             " 你没有执行此指令的权限");

                Log.Warning($"会战[群:{eventArgs.SourceGroup.Id}]", $"群成员{eventArgs.SenderInfo.Nick}正在尝试执行指令{cmdTypeStr}");
                return(false);
            }
        }
コード例 #6
0
        private static MessageBody GenReplyMessage(VideoInfo info)
        {
            StringBuilder messageBuilder = new();

            messageBuilder.Append($"Link:https://b23.tv/{info.Bid}\r\n");
            messageBuilder.Append($"标题:{info.Title}\r\n");
            messageBuilder.Append($"简介:{info.Desc}\r\n");
            messageBuilder.Append($"UP:{info.AuthName}\r\nhttps://space.bilbili.com/{info.AuthUid}\r\n");
            messageBuilder.Append($"投稿时间:{info.PublishTime:yyyy-MM-dd HH:mm:ss}");

            MessageBody sendMessage = $"Bilibili视频解析\r\n[{info.Bid}(av{info.Aid})]\r\n" +
                                      CQCodes.CQImage(info.CoverUrl) +
                                      messageBuilder.ToString();

            return(sendMessage);
        }
コード例 #7
0
ファイル: BotUtils.cs プロジェクト: DeepOceanSoft/AntiRainBot
 /// <summary>
 /// 检查参数数组长度
 /// </summary>
 /// <param name="args">指令数组</param>
 /// <param name="len">至少需要的参数个数</param>
 /// <param name="QQgroup">(可选,不给的话就不发送错误信息)\n报错信息要发送到的QQ群对象</param>
 /// <param name="fromQQid">(可选,但QQgroup给了的话本参数必填)\n要通知的人的QQ Id</param>
 /// <returns>Illegal不符合 Legitimate符合 Extra超出</returns>
 public static LenType CheckForLength(string[] args, int len, Group QQgroup = null, long fromQQid = 0)
 {
     if (args.Length >= len + 1)
     {
         if (args.Length == len + 1)
         {
             return(LenType.Legitimate);
         }
         else
         {
             return(LenType.Extra);
         }
     }
     else
     {
         QQgroup?.SendGroupMessage(CQCodes.CQAt(fromQQid), " 命令参数不全,请补充。");
         return(LenType.Illegal);
     }
 }
コード例 #8
0
        /// <summary>
        /// 零参数指令的参数检查
        /// 同时检查成员是否存在
        /// </summary>
        /// <returns>
        /// <para><see langword="true"/> 指令合法</para>
        /// <para><see langword="false"/> 有多余参数</para>
        /// </returns>
        internal static async ValueTask <bool> ZeroArgsCheck(this GroupMessageEventArgs eventArgs)
        {
            //检查参数
            switch (BotUtils.CheckForLength(eventArgs.ToCommandArgs(), 0))
            {
            case LenType.Extra:
                await eventArgs.SourceGroup.SendGroupMessage(CQCodes.CQAt(eventArgs.Sender.Id),
                                                             "\r\n听不见!重来!(有多余参数)");

                return(false);

            case LenType.Legitimate:
                return(true);

            default:
                await eventArgs.SourceGroup.SendGroupMessage(CQCodes.CQAt(eventArgs.Sender.Id),
                                                             "发生未知错误,请联系机器人管理员");

                Log.Error("Unknown error", "LenType");
                return(false);
            }
        }
コード例 #9
0
ファイル: Surprise.cs プロジェクト: DeepOceanSoft/AntiRainBot
 public async ValueTask RandomNumber(GroupMessageEventArgs eventArgs)
 {
     Random rd = new();
     await eventArgs.SourceGroup.SendGroupMessage(CQCodes.CQAt(eventArgs.Sender.Id), "丢出了\r\n",
                                                  rd.Next(1, 6));
 }
コード例 #10
0
        public static async ValueTask <MessageBody> SearchByUrl(string apiKey, string url,
                                                                GroupMessageEventArgs eventArgs)
        {
            Log.Debug("pic", "send api request");
            var req =
                await
                Requests.PostAsync($"http://saucenao.com/search.php?output_type=2&numres=16&db=5&api_key={apiKey}&url={url}",
                                   new ReqParams { Timeout = 20000 });

            var res     = req.Json();
            var resCode = Convert.ToInt32(res?["header"]?["status"] ?? -1);

            Log.Debug("pic", $"get api result code [{resCode}]");

            //API返回失败
            if (res == null || resCode != 0)
            {
                return(eventArgs.Sender.CQCodeAt() + "图片获取失败");
            }

            var resData = res["results"]?.ToObject <List <SaucenaoResult> >();

            //API返回空值
            if (resData == null)
            {
                return(eventArgs.Sender.CQCodeAt() + "处理API返回发生错误");
            }

            //未找到图片
            if (resData.Count == 0)
            {
                return(eventArgs.Sender.CQCodeAt() + "查询到的图片相似度过低,请尝试别的图片");
            }

            var parsedPic = resData.OrderByDescending(pic => Convert.ToDouble(pic.Header.Similarity))
                            .First();


            if (!ConfigManager.TryGetUserConfig(eventArgs.LoginUid, out UserConfig userConfig))
            {
                //用户配置获取失败
                Log.Error("Config", "无法获取用户配置文件");
                return(eventArgs.Sender.CQCodeAt() + "处理用户配置发生错误\r\nMessage:无法读取用户配置");
            }

            string picUrl;

            if (string.IsNullOrEmpty(userConfig.HsoConfig.PximyProxy))
            {
                var(success, msg, urls) = await GetPixivCatInfo(parsedPic.PixivData.PixivId);

                //代理连接处理失败
                if (!success)
                {
                    return(eventArgs.Sender.CQCodeAt() + $"处理代理连接发生错误\r\nApi Message:{msg}");
                }

                picUrl = urls[0];
            }
            else
            {
                picUrl = $"{userConfig.HsoConfig.PximyProxy.Trim('/')}/{parsedPic.PixivData.PixivId}";
            }

            return(eventArgs.Sender.CQCodeAt() +
                   $"\r\n图片名:{parsedPic.PixivData.Title}\r\n" +
                   CQCodes.CQImage(picUrl) +
                   $"id:{parsedPic.PixivData.PixivId}\r\n相似度:{parsedPic.Header.Similarity}%");
        }
コード例 #11
0
        private static async ValueTask GetDynamic(SoraApi soraApi, long biliUser, List <long> groupId,
                                                  SubscriptionDBHelper dbHelper)
        {
            string        textMessage;
            Dynamic       biliDynamic;
            List <string> imgList = new();

            //获取动态文本
            try
            {
                var(cardObj, cardType) = DynamicAPIs.GetLatestDynamic(biliUser);
                switch (cardType)
                {
                //检查动态类型
                case CardType.PlainText:
                    PlainTextCard plainTextCard = (PlainTextCard)cardObj;
                    textMessage = plainTextCard.ToString();
                    biliDynamic = plainTextCard;
                    break;

                case CardType.TextAndPic:
                    TextAndPicCard textAndPicCard = (TextAndPicCard)cardObj;
                    imgList.AddRange(textAndPicCard.ImgList);
                    textMessage = textAndPicCard.ToString();
                    biliDynamic = textAndPicCard;
                    break;

                case CardType.Forward:
                    ForwardCard forwardCard = (ForwardCard)cardObj;
                    textMessage = forwardCard.ToString();
                    biliDynamic = forwardCard;
                    break;

                case CardType.Video:
                    VideoCard videoCard = (VideoCard)cardObj;
                    imgList.Add(videoCard.CoverUrl);
                    textMessage = videoCard.ToString();
                    biliDynamic = videoCard;
                    break;

                case CardType.Error:
                    //Log.Error("动态获取", $"ID:{biliUser}的动态获取失败");
                    return;

                default:
                    Log.Debug("动态获取", $"ID:{biliUser}的动态获取成功,动态类型未知");
                    foreach (var gid in groupId.Where(gid => !dbHelper.UpdateDynamic(gid, biliUser,
                                                                                     DateTime.Now.ToTimeStamp())))
                    {
                        Log.Error("数据库", $"更新群[{gid}]动态记录时发生了数据库错误");
                    }

                    return;
                }
            }
            catch (Exception e)
            {
                Log.Error("获取动态更新时发生错误", Log.ErrorLogBuilder(e));
                return;
            }

            //获取用户信息
            UserInfo sender = biliDynamic.GetUserInfo();

            Log.Debug("动态获取", $"{sender.UserName}的动态获取成功");
            //检查是否是最新的
            List <long> targetGroups = groupId
                                       .Where(group => !dbHelper.IsLatestDynamic(@group, sender.Uid,
                                                                                 biliDynamic.UpdateTime))
                                       .ToList();

            //没有群需要发送消息
            if (targetGroups.Count == 0)
            {
                Log.Debug("动态获取", $"{sender.UserName}的动态已是最新");
                return;
            }

            //构建消息
            MessageBody message = new();

            message.Add($"获取到了来自 {sender.UserName} 的动态:\r\n{textMessage}");
            //添加图片
            foreach (var img in imgList)
            {
                message.Add(CQCodes.CQImage(img));
            }
            message += CQCodes.CQText($"\r\n更新时间:{biliDynamic.UpdateTime:MM-dd HH:mm:ss}");
            //向未发送消息的群发送消息
            foreach (var targetGroup in targetGroups)
            {
                Log.Info("动态获取", $"获取到{sender.UserName}的最新动态,向群{targetGroup}发送动态信息");
                await soraApi.SendGroupMessage(targetGroup, message);

                if (!dbHelper.UpdateDynamic(targetGroup, sender.Uid, biliDynamic.UpdateTime))
                {
                    Log.Error("数据库", "更新动态记录时发生了数据库错误");
                }
            }
        }