public void OpenTwitterMonitor() { var function = new Action <TweeterMonitor, Tweet>(async delegate(TweeterMonitor sender, Tweet tweet) { var content = GetTweetContent(tweet); content.Insert(0, CQCode.CQText($"您监控的{sender.Mark}有新的推文了\n")); var sendConfig = _config.Items.Single(c => c.Mark.ToString() == sender.Mark); if (sendConfig.Group != null) { foreach (var item in sendConfig.Group) { await _soraApi.SendGroupMessage(item, content); } } if (sendConfig.Private != null) { foreach (var item in sendConfig.Private) { await _soraApi.SendPrivateMessage(item, content); } } }); var client = new WebClient(); Twitter twitter = new Twitter(ref client); foreach (var tw in _config.Items.Select(item => new TweeterMonitor(item.Mark.ToString(), twitter) { TimeInterval = 60 })) { tw.NewTweetEvent += function; tw.Start(); } }
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> /// <returns> /// <para><see cref="ApiStatusType"/> API执行状态</para> /// <para><see langword="messageId"/> 发送消息的id</para> /// </returns> public async ValueTask <(ApiStatus apiStatus, int messageId)> Repeat() { return(await SoraApi.SendGroupMessage(SourceGroup.Id, Message.MessageBody)); }
/// <summary> /// 快速回复 /// </summary> /// <param name="message">消息</param> /// <param name="timeout">覆盖原有超时</param> /// <returns> /// <para><see cref="ApiStatusType"/> API执行状态</para> /// <para><see langword="messageId"/> 发送消息的id</para> /// </returns> public async ValueTask <(ApiStatus apiStatus, int messageId)> Reply(MessageBody message, TimeSpan?timeout = null) { return(await SoraApi.SendGroupMessage(SourceGroup.Id, message, timeout)); }
private static async ValueTask GetDynamic(SoraApi soraApi, long biliUser, List <long> groupId, SubscriptionDBHelper dbHelper) { string textMessage; Dynamic biliDynamic; List <string> imgList = new(); //获取动态文本 try { var cardData = DynamicAPIs.GetLatestDynamic(biliUser); switch (cardData.cardType) { //检查动态类型 case CardType.PlainText: PlainTextCard plainTextCard = (PlainTextCard)cardData.cardObj; textMessage = plainTextCard.ToString(); biliDynamic = plainTextCard; break; case CardType.TextAndPic: TextAndPicCard textAndPicCard = (TextAndPicCard)cardData.cardObj; imgList.AddRange(textAndPicCard.ImgList); textMessage = textAndPicCard.ToString(); biliDynamic = textAndPicCard; break; case CardType.Forward: ForwardCard forwardCard = (ForwardCard)cardData.cardObj; textMessage = forwardCard.ToString(); biliDynamic = forwardCard; break; case CardType.Video: VideoCard videoCard = (VideoCard)cardData.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) { if (!dbHelper.UpdateDynamic(gid, biliUser, BotUtils.GetNowStampLong())) { Log.Error("数据库", "更新动态记录时发生了数据库错误"); } } 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; } //构建消息 List <CQCode> msgList = new(); StringBuilder msgBuilder = new(); msgBuilder.Append("获取到了来自 "); msgBuilder.Append(sender.UserName); msgBuilder.Append(" 的动态:\r\n"); msgBuilder.Append(textMessage); msgList.Add(CQCode.CQText(msgBuilder.ToString())); //添加图片 imgList.ForEach(imgUrl => msgList.Add(CQCode.CQImage(imgUrl))); msgBuilder.Clear(); msgBuilder.Append("\r\n更新时间:"); msgBuilder.Append(biliDynamic.UpdateTime.ToString("MM-dd HH:mm:ss")); msgList.Add(CQCode.CQText(msgBuilder.ToString())); //向未发生消息的群发送消息 foreach (var targetGroup in targetGroups) { Log.Info("动态获取", $"获取到{sender.UserName}的最新动态,向群{targetGroup}发送动态信息"); await soraApi.SendGroupMessage(targetGroup, msgList); if (!dbHelper.UpdateDynamic(targetGroup, sender.Uid, biliDynamic.UpdateTime)) { Log.Error("数据库", "更新动态记录时发生了数据库错误"); } } }
public static async Task Connect(long qqId, string ip, ushort port, string authKey, Action <bool, string> ConnectedEvent) { ////设置log等级 //Log.LogConfiguration // .EnableConsoleOutput() // .SetLogLevel(LogLevel.Error); try { //实例化Sora服务 ISoraService service = SoraServiceFactory.CreateService(new ClientConfig() { Host = ip, Port = port, AccessToken = authKey }); service.Event.OnGroupMessage += MessageEvents.Event_OnGroupMessage; service.Event.OnPrivateMessage += MessageEvents.Event_OnPrivateMessage; //启动服务并捕捉错误 await service.StartService().RunCatch(e => Log.Error("Sora Service", Log.ErrorLogBuilder(e))); service.Event.OnClientConnect += async(eventType, eventArgs) => { SoraApi api = service.GetApi(service.ServiceId); BotInfo.QQId = api.GetLoginUserId(); List <FriendInfo> IFriendInfos = (await api.GetFriendList()).friendList; string nickname = "未知"; var self = IFriendInfos.Where(q => q.UserId == qqId).FirstOrDefault(); if (self != null) { nickname = self.Nick; } ConnectedEvent?.Invoke(true, nickname); }; BotInfo.IsLogin = true; RssWorker.StartRssTask((msgs, targetId, groupId) => { SoraApi api = service.GetApi(service.ServiceId); if (msgs != null && msgs.Count > 0) { if (msgs.First() is GreenOnionsForwardMessage forwardMessage) { _ = api.SendGroupForwardMsg(targetId, forwardMessage.ToCqHttpForwardMessage()); } else { if (targetId != -1) { _ = api.SendGroupMessage(targetId, msgs.ToCqHttpMessages(null)); } else if (groupId != -1) { _ = api.SendGroupMessage(groupId, msgs.ToCqHttpMessages(null)); } } } }); while (true) { BotInfo.IsLogin = true; if (Console.ReadLine() == "exit") { BotInfo.IsLogin = false; PluginManager.Disconnected(); ConnectedEvent?.Invoke(false, ""); break; } Task.Delay(100).Wait(); } } catch (Exception ex) { LogHelper.WriteErrorLog(ex); ConnectedEvent(false, ex.Message); } }
private static Task GetDynamic(SoraApi soraApi, long biliUser, List <long> groupId, SubscriptionDBHelper dbHelper) { string textMessage; Dynamic biliDynamic; List <string> imgList = new List <string>(); //获取动态文本 try { JObject cardData = DynamicAPIs.GetBiliDynamicJson((ulong)biliUser, out CardType cardType); switch (cardType) { //检查动态类型 case CardType.PlainText: PlainTextCard plainTextCard = new PlainTextCard(cardData); textMessage = plainTextCard.ToString(); biliDynamic = plainTextCard; break; case CardType.TextAndPic: TextAndPicCard textAndPicCard = new TextAndPicCard(cardData); imgList.AddRange(textAndPicCard.ImgList); textMessage = textAndPicCard.ToString(); biliDynamic = textAndPicCard; break; default: ConsoleLog.Warning("动态获取", $"ID:{biliUser}的动态获取成功,动态类型未知"); return(Task.CompletedTask); } } catch (Exception e) { ConsoleLog.Error("获取动态更新时发生错误", ConsoleLog.ErrorLogBuilder(e)); return(Task.CompletedTask); } //获取用户信息 BiliUserInfo sender = biliDynamic.GetUserInfo(); ConsoleLog.Debug("动态获取", $"{sender.UserName}的动态获取成功"); //检查是否是最新的 List <long> targetGroups = new List <long>(); foreach (long group in groupId) { //检查是否已经发送过消息 if (!dbHelper.IsLatest(group, sender.Uid, biliDynamic.UpdateTime)) { targetGroups.Add(group); } } //没有群需要发送消息 if (targetGroups.Count == 0) { ConsoleLog.Debug("动态获取", $"{sender.UserName}的动态已是最新"); return(Task.CompletedTask); } //构建消息 List <CQCode> msgList = new List <CQCode>(); StringBuilder sb = new StringBuilder(); sb.Append("获取到了来自 "); sb.Append(sender.UserName); sb.Append(" 的动态:\r\n"); sb.Append(textMessage); msgList.Add(CQCode.CQText(sb.ToString())); //添加图片 imgList.ForEach(imgUrl => msgList.Add(CQCode.CQImage(imgUrl))); sb.Clear(); sb.Append("\r\n更新时间:"); sb.Append(biliDynamic.UpdateTime); msgList.Add(CQCode.CQText(sb.ToString())); //向未发生消息的群发送消息 foreach (long targetGroup in targetGroups) { ConsoleLog.Info("动态获取", $"获取到{sender.UserName}的最新动态,向群{targetGroup}发送动态信息"); soraApi.SendGroupMessage(targetGroup, msgList); if (!dbHelper.Update(targetGroup, sender.Uid, biliDynamic.UpdateTime)) { ConsoleLog.Error("数据库", "更新动态记录时发生了数据库错误"); } } return(Task.CompletedTask); }