示例#1
0
        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();
            }
        }
示例#2
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);
            }
        }
 /// <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));
 }
示例#5
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 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("数据库", "更新动态记录时发生了数据库错误");
                }
            }
        }
示例#6
0
        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);
            }
        }
示例#7
0
        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);
        }