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), "的老婆 ~"); }
/// <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"); }
/// <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")); } }
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); } }
/// <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); } }
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); }
/// <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); } }
/// <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); } }
public async ValueTask RandomNumber(GroupMessageEventArgs eventArgs) { Random rd = new(); await eventArgs.SourceGroup.SendGroupMessage(CQCodes.CQAt(eventArgs.Sender.Id), "丢出了\r\n", rd.Next(1, 6)); }
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}%"); }
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("数据库", "更新动态记录时发生了数据库错误"); } } }