diff --git a/requirements.txt b/requirements.txt index d8a8cf9..d59e8b5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,3 +19,4 @@ requests~=2.31.0 pillow pyyaml qrcode +lazy_object_proxy diff --git a/src/my_sqlite/data_init/todo_init.py b/src/my_sqlite/data_init/todo_init.py new file mode 100644 index 0000000..c369325 --- /dev/null +++ b/src/my_sqlite/data_init/todo_init.py @@ -0,0 +1,29 @@ +import sqlite3 + +# 连接到数据库,如果不存在则创建 +conn = sqlite3.connect('chat_bot.db') +# 创建游标 +c = conn.cursor() +# +c.execute("""DROP TABLE IF EXISTS user_todo_list; """) +c.execute("""DROP TABLE IF EXISTS user_list; """) +# 创建表 +c.execute(""" + +CREATE TABLE user_list ( + user_id VARCHAR(100) PRIMARY KEY +); + +""") +print("user_list created") + +c.execute(""" + +CREATE TABLE user_todo_list ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id VARCHAR(100), + content TEXT, + FOREIGN KEY (user_id) REFERENCES user_list(user_id) +); + """) + diff --git a/src/my_sqlite/todo_by_sqlite.py b/src/my_sqlite/todo_by_sqlite.py new file mode 100644 index 0000000..8c81148 --- /dev/null +++ b/src/my_sqlite/todo_by_sqlite.py @@ -0,0 +1,116 @@ +from sqlalchemy import Column, Integer, String, Date, create_engine, text +from sqlalchemy.orm import declarative_base, sessionmaker +import sqlite3 + + +class SqliteSqlalchemy(object): + def __init__(self): + # 创建Sqlite连接引擎 + engine = create_engine('sqlite:///./chat_bot.db', echo=True) + # 创建Sqlite的session连接对象 + self.session = sessionmaker(bind=engine)() + + +def user_exists(member_openid): + """ + 查询数据库中是否包括此用户。 + + :param member_openid: + :return: 若包含用户返回True,否则返回False + """ + session = SqliteSqlalchemy().session + result = session.execute(selectUserId, + {'member_openid': member_openid}).fetchone() + session.close() + if result is None: + return False + else: + return True + + +def insert_user_todo_list(member_openid, content): + """ + 插入用户待办 + + :param member_openid: + :param content: 待办内容(str) + :return: + """ + session = SqliteSqlalchemy().session + if not user_exists(member_openid): + session.execute(insertUserId, {'member_openid': member_openid}) + + session.execute(insertUserTodo, {'member_openid': member_openid, 'content': content}) + session.commit() + session.close() + + +def get_user_todo_list(member_openid): + """ + 展示用户所有待办 + + :param member_openid: + :return: 数据库查询结果(Sequence) + """ + if not user_exists(member_openid): + return False + session = SqliteSqlalchemy().session + result = session.execute(selectUserTodo, + {'member_openid': member_openid}).fetchall() + session.close() + return result + + +def delete_user_todo(member_openid, del_line_num): + """ + 删除某用户指定行数的待办 + + :param member_openid: + :param del_line_num: 指定的行数(int) + :return: + """ + + if not user_exists(member_openid): + return -1 + + session = SqliteSqlalchemy().session + todo_list_len = session.execute(checkUserTodoLength, {'member_openid': member_openid}).fetchone() + max_length = int(str(todo_list_len).lstrip("(").rstrip(",)")) + if del_line_num > max_length or del_line_num < 1: + return 1 + + session.execute(deleteUserTodo, {'member_openid': member_openid, 'del_line_num': del_line_num}) + session.commit() + session.close() + return 0 + +# 查找用户 +selectUserId = text( + "select * from user_list where user_id = :member_openid") + +# 插入数据 +insertUserTodo = text( + "INSERT INTO user_todo_list (user_id, content) VALUES (:member_openid, :content)") + +# 插入用户id +insertUserId = text("INSERT INTO user_list (user_id) VALUES (:member_openid)") + +# 删除特定行的待办 +deleteUserTodo = text( + "DELETE FROM user_todo_list WHERE id=(SELECT id FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_number FROM (SELECT * FROM user_todo_list WHERE user_id = :member_openid)) WHERE row_number = :del_line_num)") + +# 查询用户待办数 +checkUserTodoLength = text( + "SELECT COUNT(*) FROM user_todo_list WHERE user_id = :member_openid") + +# 查找用户待办 +selectUserTodo = text( + "select content from user_todo_list where user_id = :member_openid") + +if __name__ == '__main__': + print('test:') + # insert_user_todo_list('111', '123') + # print(get_user_todo_list('111')) + # del_line_num = '1' + # delete_user_todo('111', int(del_line_num)) + # print(get_user_todo_list('111')) \ No newline at end of file diff --git a/src/qq_plugins/check.py b/src/qq_plugins/check.py index 542f154..84b8195 100644 --- a/src/qq_plugins/check.py +++ b/src/qq_plugins/check.py @@ -5,7 +5,7 @@ from nonebot import on_message from nonebot.adapters.qq import Message from nonebot.adapters import Bot, Event -menu = ['/今日运势','/天气','/图','/点歌','/摸摸头','/群老婆','/今日老婆', '/待办', '/test', '我喜欢你', "❤"] +menu = ['/今日运势','/天气','/图','/点歌','/摸摸头','/群老婆','/今日老婆', '/待办', '/test', '我喜欢你', "❤", "/待办查询", "/新建待办", "/删除待办"] async def check_value_in_menu(event: Event) -> bool: value = event.get_plaintext().strip().split(" ") if value[0] in menu: diff --git a/src/qq_plugins/to_do.py b/src/qq_plugins/to_do.py new file mode 100644 index 0000000..68c5d93 --- /dev/null +++ b/src/qq_plugins/to_do.py @@ -0,0 +1,59 @@ +from pathlib import Path + +from debugpy.server.cli import switches +from nonebot.rule import to_me +from nonebot.plugin import on_command +from nonebot.adapters.qq import Message, MessageEvent, MessageSegment +from src.my_sqlite.todo_by_sqlite import * + + +get_todo_list = on_command("待办查询", rule=to_me(), priority=10, block=True, aliases={"代办", "daiban"}) +@get_todo_list.handle() +async def show_todo_list(message: MessageEvent): + """ + 查询用户所有的待办 + + :param message: + :return: + """ + member_openid = message.get_user_id() + + result = get_user_todo_list(member_openid) + if result is False: + await get_todo_list.finish("您还未创建任何待办\n尝试使用 /新建待办 创建一份吧") + + todo_list = "" + count = 0 + print(result) + for each_content in result: + count += 1 + todo_content = "\n" + str(count) + "." + str(each_content).lstrip("('").rstrip("',)") + "\n" + todo_list = "".join([todo_list, todo_content]) + await get_todo_list.finish("您的待办有如下哦:⭐\n" + todo_list) + + +insert_todo = on_command("新建待办", rule=to_me(), priority=10, block=True) +@insert_todo.handle() +async def insert_todo_list(message: MessageEvent): + member_openid = message.get_user_id() + content = message.get_plaintext().replace("/新建待办", "").strip(" ") + insert_user_todo_list(member_openid, content) + await insert_todo.finish("成功添加待办,今后也要加油哦(ง •_•)ง") + + +delete_todo = on_command("删除待办", rule=to_me(), priority=10, block=True) +@delete_todo.handle() +async def del_todo(message: MessageEvent): + member_openid = message.get_user_id() + del_line_str = message.get_plaintext().replace("/删除待办", "").strip(" ") + try: + del_line_num = int(del_line_str) + except: + await delete_todo.finish("请检查您的输入是否正确。\n请输入 /删除待办+数字 哦。") + result = delete_user_todo(member_openid, int(del_line_num)) + if result == -1: + await delete_todo.finish("您还未创建过待办哦。") + elif result == 0: + await delete_todo.finish("成功删除第" + str(del_line_num) + "条待办。") + elif result == 1: + await delete_todo.finish("没有找到这条待办哦,请检查您的输入是否正确.")