diff --git a/plugins/sitestatistic/__init__.py b/plugins/sitestatistic/__init__.py index 41d4c0f..1daf5cc 100644 --- a/plugins/sitestatistic/__init__.py +++ b/plugins/sitestatistic/__init__.py @@ -43,7 +43,7 @@ class SiteStatistic(_PluginBase): # 插件图标 plugin_icon = "statistic.png" # 插件版本 - plugin_version = "2.6" + plugin_version = "2.7" # 插件作者 plugin_author = "lightolly" # 作者主页 @@ -70,6 +70,7 @@ class SiteStatistic(_PluginBase): _cron: str = "" _notify: bool = False _queue_cnt: int = 5 + _remove_failed: bool = False _statistic_type: str = None _statistic_sites: list = [] @@ -87,6 +88,7 @@ class SiteStatistic(_PluginBase): self._notify = config.get("notify") self._sitemsg = config.get("sitemsg") self._queue_cnt = config.get("queue_cnt") + self._remove_failed = config.get("remove_failed") self._statistic_type = config.get("statistic_type") or "all" self._statistic_sites = config.get("statistic_sites") or [] @@ -369,7 +371,23 @@ class SiteStatistic(_PluginBase): } } ] - } + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'remove_failed', + 'label': '移除失效站点', + } + } + ] + }, ] } ] @@ -381,6 +399,7 @@ class SiteStatistic(_PluginBase): "sitemsg": True, "cron": "5 1 * * *", "queue_cnt": 5, + "remove_failed": False, "statistic_type": "all", "statistic_sites": [] } @@ -1179,7 +1198,8 @@ class SiteStatistic(_PluginBase): "bonus": site_user_info.bonus, "url": site_url, "err_msg": site_user_info.err_msg, - "message_unread": site_user_info.message_unread + "message_unread": site_user_info.message_unread, + "updated_at": datetime.now().strftime('%Y-%m-%d') } }) return site_user_info @@ -1248,62 +1268,67 @@ class SiteStatistic(_PluginBase): if not refresh_sites: return + # 将数据初始化为前一天,筛选站点 + yesterday_sites_data = {} + today_date = datetime.now().strftime('%Y-%m-%d') + if self._statistic_type == "add" or not self._remove_failed: + if last_update_time := self.get_data("last_update_time"): + yesterday_sites_data = self.get_data(last_update_time) or {} + + if not self._remove_failed and yesterday_sites_data: + site_names = [site.get("name") for site in refresh_sites] + self._sites_data = {k: v for k, v in yesterday_sites_data.items() if k in site_names} + # 并发刷新 with ThreadPool(min(len(refresh_sites), int(self._queue_cnt or 5))) as p: p.map(self.__refresh_site_data, refresh_sites) # 通知刷新完成 if self._notify: - yesterday_sites_data = {} - # 增量数据 - if self._statistic_type == "add": - last_update_time = self.get_data("last_update_time") - if last_update_time: - yesterday_sites_data = self.get_data(last_update_time) or {} - - messages = [] - # 按照上传降序排序 - sites = self._sites_data.keys() - uploads = [self._sites_data[site].get("upload") or 0 if not yesterday_sites_data.get(site) else - int(self._sites_data[site].get("upload") or 0) - int( - yesterday_sites_data[site].get("upload") or 0) for site in sites] - downloads = [self._sites_data[site].get("download") or 0 if not yesterday_sites_data.get(site) else - int(self._sites_data[site].get("download") or 0) - int( - yesterday_sites_data[site].get("download") or 0) for site in sites] - data_list = sorted(list(zip(sites, uploads, downloads)), - key=lambda x: x[1], - reverse=True) + messages = {} # 总上传 incUploads = 0 # 总下载 incDownloads = 0 - for data in data_list: - site = data[0] - upload = int(data[1]) - download = int(data[2]) + + for rand, site in enumerate(self._sites_data.keys()): + upload = int(self._sites_data[site].get("upload") or 0) + download = int(self._sites_data[site].get("download") or 0) + updated_date = self._sites_data[site].get("updated_at") + + if self._statistic_type == "add" and yesterday_sites_data.get(site): + upload -= int(yesterday_sites_data[site].get("upload") or 0) + download -= int(yesterday_sites_data[site].get("download") or 0) + + if updated_date and updated_date != today_date: + updated_date = f"({updated_date})" + else: + updated_date = "" + if upload > 0 or download > 0: - incUploads += int(upload) - incDownloads += int(download) - messages.append(f"【{site}】\n" - f"上传量:{StringUtils.str_filesize(upload)}\n" - f"下载量:{StringUtils.str_filesize(download)}\n" - f"————————————") + incUploads += upload + incDownloads += download + messages[upload + (rand / 1000)] = ( + f"【{site}】{updated_date}\n" + + f"上传量:{StringUtils.str_filesize(upload)}\n" + + f"下载量:{StringUtils.str_filesize(download)}\n" + + "————————————" + ) if incDownloads or incUploads: - messages.insert(0, f"【汇总】\n" + sorted_messages = [messages[key] for key in sorted(messages.keys(), reverse=True)] + sorted_messages.insert(0, f"【汇总】\n" f"总上传:{StringUtils.str_filesize(incUploads)}\n" f"总下载:{StringUtils.str_filesize(incDownloads)}\n" f"————————————") self.post_message(mtype=NotificationType.SiteMessage, - title="站点数据统计", text="\n".join(messages)) + title="站点数据统计", text="\n".join(sorted_messages)) - # 获取今天的日期 - key = datetime.now().strftime('%Y-%m-%d') # 保存数据 - self.save_data(key, self._sites_data) + self.save_data(today_date, self._sites_data) # 更新时间 - self.save_data("last_update_time", key) + self.save_data("last_update_time", today_date) logger.info("站点数据刷新完成") def __custom_sites(self) -> List[Any]: @@ -1321,6 +1346,7 @@ class SiteStatistic(_PluginBase): "notify": self._notify, "sitemsg": self._sitemsg, "queue_cnt": self._queue_cnt, + "remove_failed": self._remove_failed, "statistic_type": self._statistic_type, "statistic_sites": self._statistic_sites, })