# (C) 2021 lifegpc # This file is part of rssbot. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from RSSEntry import RSSEntry, ChatEntry from typing import List from enum import Enum, unique from math import ceil, floor from config import SendUgoiraMethod from textc import textc, timeToStr from readset import settings from rssbotlib import have_rssbotlib @unique class InlineKeyBoardForRSSList(Enum): FirstPage = 0 LastPage = 1 PrevPage = 2 NextPage = 3 Close = 4 Content = 5 BackToList = 6 Unsubscribe = 7 ConfirmUnsubscribe = 8 CancleUnsubscribe = 9 SettingsPage = 10 BackToContentPage = 11 DisableWebPagePreview = 12 ShowRSSTitle = 13 ShowContentTitle = 14 ShowContent = 15 SendMedia = 16 ForceUpdate = 17 DisplayEntryLink = 18 SendImgAsFile = 19 GlobalSettingsPage = 20 SendOriginFileName = 21 SendUgoiraWithOriginPixFmt = 22 SendUgoiraMethod = 23 CompressBigImage = 24 def getTextContentForRSSInList(rssEntry: RSSEntry, s: settings) -> str: text = textc() text.addtotext( f"""{rssEntry.title}""") ttl = 0 if rssEntry.interval is None else rssEntry.interval ttl = max(min(ttl, s.maxTTL), s.minTTL) temp = f'更新间隔:{ttl}分' if rssEntry.lasterrortime is not None and rssEntry.lasterrortime >= rssEntry.lastupdatetime and rssEntry.errorcount > 0: temp = f'{temp}({s.retryTTL[rssEntry.errorcount]}分)' text.addtotext(temp) temp = '上次更新时间:未知' if rssEntry.lastupdatetime is None or rssEntry.lastupdatetime < 0 else f'上次更新时间:{timeToStr(rssEntry.lastupdatetime)}' text.addtotext(temp) if rssEntry.lasterrortime is not None: temp = f'上次更新失败时间:{timeToStr(rssEntry.lasterrortime)}' text.addtotext(temp) if rssEntry.errorcount > 0: temp = f'连续更新失败次数:{rssEntry.errorcount}' text.addtotext(temp) if len(rssEntry.chatList) > 0: chatEntry: ChatEntry = rssEntry.chatList[0] config = chatEntry.config text.addtotext("设置:") text.addtotext(f"禁用预览:{config.disable_web_page_preview}") text.addtotext(f"显示RSS标题:{config.show_RSS_title}") text.addtotext(f"显示内容标题:{config.show_Content_title}") text.addtotext(f"显示内容:{config.show_content}") text.addtotext(f"发送媒体:{config.send_media}") text += f"单独一行显示链接:{config.display_entry_link}" text += f"发送图片为文件:{config.send_img_as_file}" if have_rssbotlib: text += f'发送原始像素格式的Pixiv动图:{config.send_ugoira_with_origin_pix_fmt}' text += f'发送Pixiv动图为{config.send_ugoira_method}' text += f"发送时压缩过大图片:{config.compress_big_image}" text += f"RSS全局设置:" text += f"发送时使用原文件名:{config.send_origin_file_name}" return text.tostr() def getTextContentForRSSUnsubscribeInList(rssEntry: RSSEntry) -> str: return f"""你是否要取消订阅{rssEntry.title}?""" def getInlineKeyBoardForRSSList(chatId: int, RSSEntries: List[RSSEntry], page: int = 1, lastPage: bool = False, itemIndex: int = None) -> dict: d = [] i = -1 lineLimit = 7 l = len(RSSEntries) pn = ceil(l / lineLimit) if lastPage: page = pn if itemIndex is not None and itemIndex >= 0: page = floor(itemIndex / lineLimit) + 1 if l != 0: page = max(min(pn, page), 1) s = max(lineLimit * (page - 1), 0) n = min(lineLimit * page, l) while s < n: rss = RSSEntries[s] d.append([]) i = i + 1 d[i].append( {'text': rss.title, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.Content.value},{s},{rss.id}'}) s = s + 1 if pn != 1: d.append([]) i = i + 1 if page != 1: d[i].append( {'text': '上一页', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.PrevPage.value},{page}'}) if page != pn: d[i].append( {'text': '下一页', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.NextPage.value},{page}'}) d.append([]) i = i + 1 if page != 1: d[i].append( {'text': '首页', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.FirstPage.value}'}) if page != pn: d[i].append( {'text': '尾页', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.LastPage.value}'}) d.append([]) i = i + 1 d[i].append( {'text': '关闭', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.Close.value}'}) return {'inline_keyboard': d} def getInlineKeyBoardForRSSInList(chatId: int, rssEntry: RSSEntry, index: int, isOwner: bool = False) -> dict: d = [] i = -1 d.append([]) i = i + 1 d[i].append( {'text': '取消订阅', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.Unsubscribe.value},{index},{rssEntry.id}'}) if not rssEntry.forceupdate and isOwner: d.append([]) i = i + 1 d[i].append( {'text': '强制更新', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.ForceUpdate.value},{index},{rssEntry.id}'}) d.append([]) i = i + 1 d[i].append( {'text': '设置', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.SettingsPage.value},{index},{rssEntry.id}'}) if isOwner: d.append([]) i += 1 d[i].append({'text': 'RSS全局设置', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.GlobalSettingsPage.value},{index},{rssEntry.id}'}) d.append([]) i = i + 1 d[i].append( {'text': '返回', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.BackToList.value},{index}'}) return {'inline_keyboard': d} def getInlineKeyBoardForRSSUnsubscribeInList(chatId: int, rssEntry: RSSEntry, index: int) -> dict: d = [] i = -1 d.append([]) i = i + 1 d[i].append( {'text': '是', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.ConfirmUnsubscribe.value},{index},{rssEntry.id}'}) d[i].append( {'text': '否', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.CancleUnsubscribe.value},{index},{rssEntry.id}'}) return {'inline_keyboard': d} def getInlineKeyBoardForRSSSettingsInList(chatId: int, rssEntry: RSSEntry, index: int, page: int = 1) -> dict: d = [] i = -1 if page != 1: page = 1 chatInfo: ChatEntry = rssEntry.chatList[0] config = chatInfo.config if page == 1: d.append([]) i = i + 1 temp = '启用预览' if config.disable_web_page_preview else '禁用预览' d[i].append( {'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.DisableWebPagePreview.value},{index},{rssEntry.id}'}) temp = '隐藏RSS标题' if config.show_RSS_title else '显示RSS标题' d[i].append( {'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.ShowRSSTitle.value},{index},{rssEntry.id}'}) d.append([]) i = i + 1 temp = '隐藏内容标题' if config.show_Content_title else '显示内容标题' d[i].append( {'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.ShowContentTitle.value},{index},{rssEntry.id}'}) temp = '隐藏内容' if config.show_content else '显示内容' d[i].append( {'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.ShowContent.value},{index},{rssEntry.id}'}) d.append([]) i = i + 1 temp = '禁用发送媒体' if config.send_media else '启用发送媒体' d[i].append( {'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.SendMedia.value},{index},{rssEntry.id}'}) temp = '禁用单独一行显示链接' if config.display_entry_link else '启用单独一行显示链接' d[i].append({'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.DisplayEntryLink.value},{index},{rssEntry.id}'}) d.append([]) i += 1 temp = '禁用发送图片为文件' if config.send_img_as_file else '启用发送图片为文件' d[i].append({'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.SendImgAsFile.value},{index},{rssEntry.id}'}) if have_rssbotlib: temp = f"{'禁用' if config.send_ugoira_with_origin_pix_fmt else '启用'}发送原始像素格式的Pixiv动图" d[i].append({'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.SendUgoiraWithOriginPixFmt.value},{index},{rssEntry.id}'}) d.append([]) i += 1 temp2 = SendUgoiraMethod((config.send_ugoira_method.value + 1) % 4) temp = f'发送Pixiv动图为{temp2}' d[i].append({'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.SendUgoiraMethod.value},{index},{rssEntry.id},{temp2.value}'}) temp = f"{'禁用' if config.compress_big_image else '启用'}压缩过大图片" d[i].append({'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.CompressBigImage.value},{index},{rssEntry.id}'}) d.append([]) i = i + 1 d[i].append( {'text': '返回', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.BackToContentPage.value},{index},{rssEntry.id}'}) return {'inline_keyboard': d} def getInlineKeyBoardForRSSGlobalSettingsInList(chatId: int, rssEntry: RSSEntry, index: int, page: int = 1) -> dict: d = [] i = -1 if page != 1: page = 1 chatInfo: ChatEntry = rssEntry.chatList[0] config = chatInfo.config if page == 1: temp = '禁用发送时使用原文件名' if config.send_origin_file_name else '启用发送时使用原文件名' d.append([]) i += 1 d[i].append({'text': temp, 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.SendOriginFileName.value},{index},{rssEntry.id}'}) d.append([]) i += 1 d[i].append({'text': '返回', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.BackToContentPage.value},{index},{rssEntry.id}'}) return {'inline_keyboard': d}