更新管理功能(未完成

This commit is contained in:
2022-09-05 04:45:40 +00:00
parent b400332423
commit 5393d90990
3 changed files with 269 additions and 3 deletions

View File

@@ -338,6 +338,14 @@ class database:
return i[0]
return None
def getChatIdList(self) -> int:
with self._value_lock:
cur = self._db.execute('SELECT DISTINCT chatId FROM chatList;')
r = []
for i in cur:
r.append(i[0])
return r
def getChatName(self, chat_id: int, maxCacheTime: int = 3600) -> Optional[str]:
with self._value_lock:
cur = self._db.execute('SELECT name FROM chatNameCache WHERE id = ? AND time > ?;', (chat_id, round(time()) - maxCacheTime))
@@ -360,6 +368,7 @@ class database:
return None
def getRSSList(self) -> Optional[List[RSSEntry]]:
'''返回不带chatList和hashList的RSS列表'''
with self._value_lock:
cur = self._db.execute(f'SELECT * FROM RSSList;')
r = []

147
manage.py
View File

@@ -14,6 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from enum import Enum, unique
from html import escape
from math import ceil, floor
from typing import List
from readset import settings
from rssbotlib import have_rssbotlib
from RSSEntry import ChatEntry, RSSEntry
from textc import textc, timeToStr
@unique
@@ -22,6 +29,13 @@ class InlineKeyBoardForManage(Enum):
ManageByRSS = 1
ManageByChatId = 2
FirstPage = 3
LastPage = 4
PrevPage = 5
NextPage = 6
ManageMenu = 7
RSSManage = 8
ChatManage = 9
BackToList = 10
def getInlineKeyBoardForManage():
@@ -37,3 +51,136 @@ def getInlineKeyBoardForManage():
i += 1
d[i].append({'text': '关闭', 'callback_data': f'3,{InlineKeyBoardForManage.Close.value}'})
return {'inline_keyboard': d}
def getInlineKeyBoardForManageRSSList(RSSEntries: List[RSSEntry], page: int = 1, lastPage: bool = False, itemIndex: int = None, base: str = None, back: str = None):
d = []
i = -1
lineLimit = 7
if base is None:
base = f'3,{InlineKeyBoardForManage.ManageByRSS.value}'
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'{base},{InlineKeyBoardForManage.RSSManage.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'{base},{InlineKeyBoardForManage.PrevPage.value},{page}'})
if page != pn:
d[i].append({'text': '下一页', 'callback_data': f'{base},{InlineKeyBoardForManage.NextPage.value},{page}'})
d.append([])
i = i + 1
if page != 1:
d[i].append({'text': '首页', 'callback_data': f'{base},{InlineKeyBoardForManage.FirstPage.value}'})
if page != pn:
d[i].append({'text': '尾页', 'callback_data': f'{base},{InlineKeyBoardForManage.LastPage.value}'})
d.append([])
i = i + 1
d[i].append({'text': '返回', 'callback_data': f'3,{InlineKeyBoardForManage.ManageMenu.value}' if back is None else back})
return {'inline_keyboard': d}
def getInlineKeyBoardForManageChatList(m, chatList: List[int], page: int = 1, lastPage: bool = False, itemIndex: int = None):
d = []
i = -1
lineLimit = 7
base = f'3,{InlineKeyBoardForManage.ManageByChatId.value}'
l = len(chatList)
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:
chat_id = chatList[s]
d.append([])
i = i + 1
d[i].append({'text': m.getChatName(chat_id), 'callback_data': f'{base},{InlineKeyBoardForManage.ChatManage.value},{s},{chat_id}'})
s = s + 1
if pn != 1:
d.append([])
i = i + 1
if page != 1:
d[i].append({'text': '上一页', 'callback_data': f'{base},{InlineKeyBoardForManage.PrevPage.value},{page}'})
if page != pn:
d[i].append({'text': '下一页', 'callback_data': f'{base},{InlineKeyBoardForManage.NextPage.value},{page}'})
d.append([])
i = i + 1
if page != 1:
d[i].append({'text': '首页', 'callback_data': f'{base},{InlineKeyBoardForManage.FirstPage.value}'})
if page != pn:
d[i].append({'text': '尾页', 'callback_data': f'{base},{InlineKeyBoardForManage.LastPage.value}'})
d.append([])
i = i + 1
d[i].append({'text': '返回', 'callback_data': f'3,{InlineKeyBoardForManage.ManageMenu.value}'})
return {'inline_keyboard': d}
def getTextContentForRSSInManageList(m, rssEntry: RSSEntry, s: settings, chatId: int = None) -> str:
text = textc()
text.addtotext(
f"""<a href="{rssEntry.url}">{rssEntry.title}</a>""")
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 chatId is not None:
chatName = m.getChatName(chatId)
temp = chatName if chatId < 0 else f'<a href="tg://user?id={chatId}">{escape(chatName)}</a>'
text.addtotext(f'订阅用户:{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 getInlineKeyBoardForRSSInManageList(rss: RSSEntry, index: int, chatId: int = None, chatIndex: int = None):
d = []
i = -1
d.append([])
i += 1
have_chat_id = chatId is not None and chatIndex is not None
d[i].append({'text': '返回', 'callback_data': (f'3,{InlineKeyBoardForManage.ManageByChatId.value},{InlineKeyBoardForManage.ChatManage.value},{chatIndex},{chatId}' if have_chat_id else f'3,{InlineKeyBoardForManage.ManageByRSS.value}') + f',{InlineKeyBoardForManage.BackToList.value},{index}' })
return {'inline_keyboard': d}

116
rssbot.py
View File

@@ -42,7 +42,7 @@ from miraiDatabase import MiraiDatabase
from mirai import Mirai
from blackList import BlackList, InlineKeyBoardForBlackList, getInlineKeyBoardForBlackList, getTextContentForBlackInfo, getInlineKeyBoardForBlackInfo, getTextContentForUnbanBlackInfo, getInlineKeyBoardForUnbanBlackInfo, BlackInfo
from json import loads
from manage import getInlineKeyBoardForManage, InlineKeyBoardForManage
from manage import getInlineKeyBoardForManage, InlineKeyBoardForManage, getInlineKeyBoardForManageRSSList, getInlineKeyBoardForManageChatList, getTextContentForRSSInManageList, getInlineKeyBoardForRSSInManageList
MAX_ITEM_IN_MEDIA_GROUP = 10
@@ -2006,14 +2006,124 @@ class callbackQueryHandle(Thread):
return
elif self._inlineKeyBoardForManageCommand in [InlineKeyBoardForManage.ManageByRSS, InlineKeyBoardForManage.ManageByChatId]:
innerCommand = None
is_rss_manage = False
rssManageCommand = None
rssManageChatIndex = None
rssManageChatId = None
rssManageRSSId = None
rssManageIndex = None
rssManageSubList = None
if len(self._inputList) > 2:
try:
innerCommand = InlineKeyBoardForManage(int(self._inputList[2]))
except Exception:
self.answer('未知的按钮。')
return
if innerCommand is None or innerCommand == InlineKeyBoardForManage.FirstPage:
pass
if innerCommand is None or innerCommand in [InlineKeyBoardForManage.FirstPage, InlineKeyBoardForManage.LastPage, InlineKeyBoardForManage.NextPage, InlineKeyBoardForManage.PrevPage, InlineKeyBoardForManage.BackToList]:
page = 1
lastPage = False
itemIndex = None
if innerCommand == InlineKeyBoardForManage.LastPage:
lastPage = True
elif innerCommand == InlineKeyBoardForManage.NextPage:
page = int(self._inputList[3]) + 1
elif innerCommand == InlineKeyBoardForManage.PrevPage:
page = int(self._inputList[3]) - 1
elif innerCommand == InlineKeyBoardForManage.BackToList:
itemIndex = int(self._inputList[3])
if self._inlineKeyBoardForManageCommand == InlineKeyBoardForManage.ManageByRSS:
rssList = self._main._db.getRSSList()
di['text'] = '列表如下:'
di['reply_markup'] = getInlineKeyBoardForManageRSSList(rssList, page, lastPage, itemIndex)
self._main._request("editMessageText", "post", json=di)
return
else:
chatList = self._main._db.getChatIdList()
di['text'] = '列表如下:'
di['reply_markup'] = getInlineKeyBoardForManageChatList(self._main, chatList, page, lastPage, itemIndex)
self._main._request("editMessageText", "post", json=di)
return
elif innerCommand == InlineKeyBoardForManage.ChatManage:
innerCommand2 = None
try:
index = max(int(self._inputList[3]), 0)
chat_id = int(self._inputList[4])
except Exception:
self.answer('未知的按钮。')
return
if len(self._inputList) > 5:
try:
innerCommand2 = InlineKeyBoardForManage(int(self._inputList[5]))
except Exception:
self.answer('未知的按钮。')
return
if innerCommand2 is None or innerCommand2 in [InlineKeyBoardForManage.FirstPage, InlineKeyBoardForManage.LastPage, InlineKeyBoardForManage.NextPage, InlineKeyBoardForManage.PrevPage, InlineKeyBoardForManage.BackToList]:
page = 1
lastPage = False
itemIndex = None
if innerCommand2 == InlineKeyBoardForManage.LastPage:
lastPage = True
elif innerCommand2 == InlineKeyBoardForManage.NextPage:
page = int(self._inputList[6]) + 1
elif innerCommand2 == InlineKeyBoardForManage.PrevPage:
page = int(self._inputList[6]) - 1
elif innerCommand2 == InlineKeyBoardForManage.BackToList:
itemIndex = int(self._inputList[6])
rssList = self._main._db.getRSSListByChatId(chat_id)
di['text'] = '列表如下:'
di['reply_markup'] = getInlineKeyBoardForManageRSSList(rssList, page, lastPage, itemIndex, base=f"3,{InlineKeyBoardForManage.ManageByChatId.value},{InlineKeyBoardForManage.ChatManage.value},{index},{chat_id}", back=f"3,{InlineKeyBoardForManage.ManageByChatId.value},{InlineKeyBoardForManage.BackToList.value},{index}")
self._main._request("editMessageText", "post", json=di)
return
elif innerCommand2 == InlineKeyBoardForManage.RSSManage:
try:
rssManageIndex = int(self._inputList[6])
rssManageRSSId = int(self._inputList[7])
except Exception:
self.answer('未知的按钮。')
return
rssManageChatId = chat_id
rssManageChatIndex = index
if len(self._inputList) > 8:
try:
rssManageCommand = InlineKeyBoardForManage(int(self._inputList[8]))
except Exception:
self.answer('未知的按钮。')
return
if len(self._inputList) > 9:
rssManageSubList = self._inputList[9:]
is_rss_manage = True
elif innerCommand == InlineKeyBoardForManage.RSSManage:
is_rss_manage = True
try:
rssManageIndex = int(self._inputList[3])
rssManageRSSId = int(self._inputList[4])
except:
self.answer('未知的按钮。')
return
if len(self._inputList) > 5:
try:
rssManageCommand = InlineKeyBoardForManage(int(self._inputList[5]))
except Exception:
self.answer('未知的按钮。')
return
if len(self._inputList) > 6:
rssManageSubList = self._inputList[6:]
if is_rss_manage:
if rssManageChatId is not None:
rssEntry = self._main._db.getRSSByIdAndChatId(rssManageRSSId, rssManageChatId)
else:
pass
if rssManageCommand is None:
di['text'] = getTextContentForRSSInManageList(self._main, rssEntry, self._main._setting, rssManageChatId)
di['parse_mode'] = 'HTML'
di['reply_markup'] = getInlineKeyBoardForRSSInManageList(rssEntry, rssManageIndex, rssManageChatId, rssManageChatIndex)
self._main._request("editMessageText", "post", json=di)
return
elif self._inlineKeyBoardForManageCommand == InlineKeyBoardForManage.ManageMenu:
di['text'] = '请选择管理模式:'
di['reply_markup'] = getInlineKeyBoardForManage()
self._main._request("editMessageText", "post", json=di)
return
else:
self.answer('未知的按钮。')
return