diff --git a/database.py b/database.py index 1ac4e7b..ded59cd 100644 --- a/database.py +++ b/database.py @@ -197,6 +197,15 @@ PRIMARY KEY (hash) pass return userStatus.normalStatus, '' + def removeItemInChatList(self, chatId: int, id: str): + with self._value_lock: + try: + self._db.execute( + f"DELETE FROM chatList WHERE chatId={chatId} AND id='{id}'") + return True + except: + return False + def setUserStatus(self, userId: int, status: userStatus = userStatus.normalStatus, hashd: str = '') -> bool: with self._value_lock: try: diff --git a/rssbot.py b/rssbot.py index 930a31b..5fec619 100644 --- a/rssbot.py +++ b/rssbot.py @@ -30,7 +30,7 @@ from random import randrange from textc import textc, removeEmptyLine, decodeURI from re import search, I from rsschecker import RSSCheckerThread -from rsslist import getInlineKeyBoardForRSSList, InlineKeyBoardForRSSList, getInlineKeyBoardForRSSInList, getTextContentForRSSInList +from rsslist import getInlineKeyBoardForRSSList, InlineKeyBoardForRSSList, getInlineKeyBoardForRSSInList, getTextContentForRSSInList, getInlineKeyBoardForRSSUnsubscribeInList, getTextContentForRSSUnsubscribeInList from usercheck import checkUserPermissionsInChat, UserPermissionsInChatCheckResult import sys @@ -866,13 +866,12 @@ class callbackQueryHandle(Thread): 'message_id': self._data['message']['message_id']} self._main._request("deleteMessage", "post", json=di) return - elif self._inlineKeyBoardForRSSListCommand == InlineKeyBoardForRSSList.Content: + elif self._inlineKeyBoardForRSSListCommand in [InlineKeyBoardForRSSList.Content, InlineKeyBoardForRSSList.CancleUnsubscribe]: di = {'chat_id': self._data['message']['chat']['id'], 'message_id': self._data['message']['message_id']} rssList = self._main._db.getRSSListByChatId(chatId) ind = int(self._inputList[3]) - if ind >= len(rssList): - ind = len(rssList) - 1 + ind = max(min(ind, len(rssList)), 0) di['text'] = getTextContentForRSSInList(rssList[ind]) di['parse_mode'] = 'HTML' di['reply_markup'] = getInlineKeyBoardForRSSInList( @@ -891,6 +890,42 @@ class callbackQueryHandle(Thread): self._main._request("editMessageText", "post", json=di) self.answer() return + elif self._inlineKeyBoardForRSSListCommand == InlineKeyBoardForRSSList.Unsubscribe: + di = {'chat_id': self._data['message']['chat']['id'], + 'message_id': self._data['message']['message_id']} + rssList = self._main._db.getRSSListByChatId(chatId) + ind = int(self._inputList[3]) + ind = max(min(ind, len(rssList)), 0) + di['text'] = getTextContentForRSSUnsubscribeInList( + rssList[ind]) + di['parse_mode'] = 'HTML' + di['reply_markup'] = getInlineKeyBoardForRSSUnsubscribeInList( + chatId, rssList[ind], ind) + self._main._request("editMessageText", "post", json=di) + self.answer() + return + elif self._inlineKeyBoardForRSSListCommand == InlineKeyBoardForRSSList.ConfirmUnsubscribe: + di = {'chat_id': self._data['message']['chat']['id'], + 'message_id': self._data['message']['message_id']} + rssList = self._main._db.getRSSListByChatId(chatId) + ind = int(self._inputList[3]) + if ind >= len(rssList) or ind < 0: + self.answer('取消订阅失败:无效的索引。') + else: + unsubscribed = self._main._db.removeItemInChatList( + chatId, rssList[ind].id) + if unsubscribed: + self.answer('取消订阅成功。') + ind = ind - 1 + else: + self.answer('取消订阅失败:数据库删除失败。') + rssList = self._main._db.getRSSListByChatId(chatId) + ind = max(min(ind, len(rssList)), 0) + di['text'] = '列表如下:' + di['reply_markup'] = getInlineKeyBoardForRSSList( + chatId, rssList, itemIndex=ind) + self._main._request("editMessageText", "post", json=di) + return else: self.answer('未知的按钮。') return diff --git a/rsslist.py b/rsslist.py index 962fc02..784e2f4 100644 --- a/rsslist.py +++ b/rsslist.py @@ -116,3 +116,15 @@ def getInlineKeyBoardForRSSInList(chatId: int, rssEntry: RSSEntry, index: int) - 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}'}) + d[i].append( + {'text': '否', 'callback_data': f'1,{chatId},{InlineKeyBoardForRSSList.CancleUnsubscribe.value},{index}'}) + return {'inline_keyboard': d}