From cef359da64ef7a8fff5f81ed112fd29c0c2f32c1 Mon Sep 17 00:00:00 2001 From: oldpear <1453599706@qq.com> Date: Sat, 5 Jul 2025 17:26:12 +0800 Subject: [PATCH] first commit --- .gitignore | 5 + config.toml | 22 +++ control/__init__.py | 0 control/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 143 bytes control/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 125 bytes control/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 119 bytes control/__pycache__/group.cpython-311.pyc | Bin 0 -> 7445 bytes control/__pycache__/notice.cpython-311.pyc | Bin 0 -> 4059 bytes control/__pycache__/private.cpython-311.pyc | Bin 0 -> 6989 bytes control/__pycache__/request.cpython-311.pyc | Bin 0 -> 2733 bytes control/group.py | 150 +++++++++++++++++++ control/notice.py | 62 ++++++++ control/private.py | 141 +++++++++++++++++ control/request.py | 42 ++++++ main.py | 82 ++++++++++ model/AiCat.py | 55 +++++++ model/McBind.py | 51 +++++++ model/McFind.py | 55 +++++++ model/McHh.py | 68 +++++++++ model/McList.py | 87 +++++++++++ model/__init__.py | 0 model/__pycache__/AiCat.cpython-311.pyc | Bin 0 -> 2660 bytes model/__pycache__/AiCat.cpython-312.pyc | Bin 0 -> 2445 bytes model/__pycache__/AiCat.cpython-38.pyc | Bin 0 -> 1646 bytes model/__pycache__/McBind.cpython-311.pyc | Bin 0 -> 2534 bytes model/__pycache__/McBind.cpython-312.pyc | Bin 0 -> 1806 bytes model/__pycache__/McBind.cpython-38.pyc | Bin 0 -> 1502 bytes model/__pycache__/McFind.cpython-311.pyc | Bin 0 -> 2952 bytes model/__pycache__/McFind.cpython-312.pyc | Bin 0 -> 2227 bytes model/__pycache__/McFind.cpython-38.pyc | Bin 0 -> 1666 bytes model/__pycache__/McHh.cpython-311.pyc | Bin 0 -> 3090 bytes model/__pycache__/McHh.cpython-312.pyc | Bin 0 -> 1650 bytes model/__pycache__/McHh.cpython-38.pyc | Bin 0 -> 1774 bytes model/__pycache__/McList.cpython-311.pyc | Bin 0 -> 4845 bytes model/__pycache__/McList.cpython-312.pyc | Bin 0 -> 3843 bytes model/__pycache__/McList.cpython-38.pyc | Bin 0 -> 2570 bytes model/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 141 bytes model/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 123 bytes model/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 117 bytes 39 files changed, 820 insertions(+) create mode 100644 .gitignore create mode 100644 config.toml create mode 100644 control/__init__.py create mode 100644 control/__pycache__/__init__.cpython-311.pyc create mode 100644 control/__pycache__/__init__.cpython-312.pyc create mode 100644 control/__pycache__/__init__.cpython-38.pyc create mode 100644 control/__pycache__/group.cpython-311.pyc create mode 100644 control/__pycache__/notice.cpython-311.pyc create mode 100644 control/__pycache__/private.cpython-311.pyc create mode 100644 control/__pycache__/request.cpython-311.pyc create mode 100644 control/group.py create mode 100644 control/notice.py create mode 100644 control/private.py create mode 100644 control/request.py create mode 100644 main.py create mode 100644 model/AiCat.py create mode 100644 model/McBind.py create mode 100644 model/McFind.py create mode 100644 model/McHh.py create mode 100644 model/McList.py create mode 100644 model/__init__.py create mode 100644 model/__pycache__/AiCat.cpython-311.pyc create mode 100644 model/__pycache__/AiCat.cpython-312.pyc create mode 100644 model/__pycache__/AiCat.cpython-38.pyc create mode 100644 model/__pycache__/McBind.cpython-311.pyc create mode 100644 model/__pycache__/McBind.cpython-312.pyc create mode 100644 model/__pycache__/McBind.cpython-38.pyc create mode 100644 model/__pycache__/McFind.cpython-311.pyc create mode 100644 model/__pycache__/McFind.cpython-312.pyc create mode 100644 model/__pycache__/McFind.cpython-38.pyc create mode 100644 model/__pycache__/McHh.cpython-311.pyc create mode 100644 model/__pycache__/McHh.cpython-312.pyc create mode 100644 model/__pycache__/McHh.cpython-38.pyc create mode 100644 model/__pycache__/McList.cpython-311.pyc create mode 100644 model/__pycache__/McList.cpython-312.pyc create mode 100644 model/__pycache__/McList.cpython-38.pyc create mode 100644 model/__pycache__/__init__.cpython-311.pyc create mode 100644 model/__pycache__/__init__.cpython-312.pyc create mode 100644 model/__pycache__/__init__.cpython-38.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56f299c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +napcat/ +logs/ +.idea/ +.venv/ +data/ \ No newline at end of file diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..b498fed --- /dev/null +++ b/config.toml @@ -0,0 +1,22 @@ +#napcat配置 +bot_qq = 123456 #机器人q号 +root_qq = 1234567 # 管理员q号 +ws_uri = "ws://localhost:3001" # ws 地址, 可自定义端口, 默认 3001 +webui_uri = "http://localhost:6099" # webui 地址, 可自定义端口, 默认 6099 +webui_token = "napcat" # webui 令牌, 默认 napcat +ws_token = "" # ws_uri 令牌, 默认留空 +ws_listen_ip = "localhost" # ws_uri 监听 ip, 默认 localhost 监听本机,监听全部则配置 0.0.0.0 +remote_mode = false # 是否远程模式, 即 NapCat 服务不在本机运行 ps:ncatbot官方已废弃该参数 + +# 功能配置 +allowed_groups = "all" # 授权群聊,all为全部,eg:[123456789, 987654321] +allowed_users = "all" # 授权用户,all为全部,eg:[123456789, 987654321] +velocity_ip = "127.0.0.1" # velocity ip +velocity_port = 8080 # velocity port +velocity_token = "your velocity_token" #`velocity token +friend_auto = true # 好友自动同意 +group_auto = true # 无作用 +group_welcome = true # 入群欢迎 +group_welcome_message = "!at 欢迎加入本群,使用@bot /help获取此bot帮助" # 入群消息 !at 为@加群用户 +group_leave = true # 退群提醒 +group_leave_message = "用户{userid}退群了" # 退群消息 ,{userid}为退群用户id diff --git a/control/__init__.py b/control/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/control/__pycache__/__init__.cpython-311.pyc b/control/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3dc744462a9fa0b2564b430e516c863c0b59764 GIT binary patch literal 143 zcmZ3^%ge<81e_TU(?RrO5CH>>P{wCAAY(d13PUi1CZpdg`k0?v$w=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2D8#VRIHAt}Ek oCOJQ^q$ocpCO$qhFS8^*Uaz3?7Kcr4eoARhsvStzXCP((044SpdjJ3c literal 0 HcmV?d00001 diff --git a/control/__pycache__/group.cpython-311.pyc b/control/__pycache__/group.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a64eaf77eabc5192d07e191353d5269f51bbcb8a GIT binary patch literal 7445 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 literal 0 HcmV?d00001 diff --git a/control/__pycache__/notice.cpython-311.pyc b/control/__pycache__/notice.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4430a2be3d043042d520b0be3da0120bee3e4b8 GIT binary patch literal 4059 zcmcInTWs6b89o$A-6+M96~}i=NgU5|9D8c*HE`?(i@g|aQg4A#taegps>rzVWXURw#T=zyecil$FPfNsEGZ@?b*Kp6xg5C~9Ux8!LGk^qLE_Wz_r zi?;GGU^|pP{kQXe$QJ%s!Xm2%@s!sG9Puu4QCGHEht{xXw{ zgNzc<@eUE$n+`&5!`Ez+4v`rrQSKqCW66@$_+d)Q;|>s3i9{wDkzo8gWRk^Plbpx` z@*)T56nV(w)Sa2El1fTRYXs@8zBw{j~QD`=O$-Il6*=xEx4)v#$czmIzWGowS&g6FimPkQ3u)L@V zt?J>}mJm~g*w^ECTebdC_1wj+{)=k=#X>{#2WQuW<&oVxVH8pi02Efk@aS+ z^#sUch47K}AuSwR9?^U)g_iKTckPE@f2C5ih3uwTKEHhaTVG&#BmJ$ivbh(VgS25_&wxtykQIRT>f9q6gNN#T6eD(fi3BW==YQ!{M^? zH3Phn1;yO*(piUT~wM)Cz6suf4b)fZzZK!C6&$Su5@;43TxvfO0zWTH1?g&T-KfD{m?cT znuY;%Mw0QdMvP``N@E8v)RoxKPVr3;Dt`r&vqbK@{mY4W-PhgA?xG{$X}BM(Tgk4= zU;kJQ4&{SGT5zaHeE!HEgZCR-*BaMjAGWNutT+pij$7VOy`P=VM^0&xQ!D=afx4BM ze4t$mw5x&kLTAq%?-yS6`IqyZ=d{jqYTy_IsE3Z{1KnDnTMcvKg}NOHeIRed4EZ@jK8^Aw5x~Cb z=Z1r>%^-{NK?dbILvHepIN8ni`Vofx6T^dComC&e`dCHYv{)2)lR@VElB>d-7FWW) zwca#Ud9xxC?x)m5-oCdNSzyNMk$V}IQ!Jh!z*6=+1~Z-&T?RAuJ(C$-3LZmB4LH&| zHQBS-S@GF?_CPqoWRQf&ZQ>J!2G4jTD)IBBRk309`P7BP}Ja zN_wb5u^7?)Gd$v@#6@}-Iz$C}6g#&g97E_pID+sU0G*W;Y7iamL|YW03!p@9^f(&2 z5qc5uUj;n@u#esFXtIah$_LgSjDOEyx1yt_I;9EwDXp#jH`5_&|b}~9@o9`_)J!uOQY{qP8FPpUYK Gq5cC}OK$D} literal 0 HcmV?d00001 diff --git a/control/__pycache__/private.cpython-311.pyc b/control/__pycache__/private.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffafbb5940d667a14ffbb350b2a09f432ab3f0b8 GIT binary patch literal 6989 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 literal 0 HcmV?d00001 diff --git a/control/__pycache__/request.cpython-311.pyc b/control/__pycache__/request.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0986c753a1b8990f19ca13333f8742685934b8af GIT binary patch literal 2733 zcmdT_O>7%Q6rR~1|HMvGr)eA~j+-{6)QF@Msp?PCR;i#+AtF$bP@_tV>s=cg+ndg= zNn0EgK@m9=kwes|ZBTOxR6&FjLMk9~;hZ2J%!)`z{Iw@srASe@@ZPR>*G(;?9+~le z`^}rT@9n((#`9@&a}$B~{y%TL*)0@KHSCmPsYPO})*Y+!de&D!O_ zI4-AID4XN&a+>wj*6Y6>$+QqAX;f^G<@Tp}Ik3;}}}d|pdyxWL}t&0WtOJ@;zwc~w96b`mkE z7IdcO&ef6(j9oH(l9VZAbV<6r&9>SWT%Gm`z$B@(hi6`#60Z6y;jWo?fCMYio#p7$ zQ$pDnsdRSF1;N(r635FSc7Q4Wlz$ydl5{=}44lu4>1Lti?&p>1Tju9tT_rMK{|p8( z+XCQXjT16KOO$akcLtOS7ZzF=F+3@jQ3~>Fr{Wy*fv@39D>|$^rGlXa4FStTN)&aq zRzJ24Cxm<=Q@Ct@m;oHMf?YcV0F?=}mIKjw-;aTPD}jBLuGp>q8~xY!&+VUjsnXh2 zC46&FCEPu&{}PT)7pnmhjDs6%gJ&Nq04m1RcMz61OZ-HyTdGWDPUb%s7QkcC(da=~ zs_u*ksZ%&zfTtIo2oqe1o3HbPT(u^PTReH#_Rt^R;*=BuedGYqgmLa7f0m3>O3o4r zy#yuhBRW>J*7gv#dqU6y_88vF*$uL%B-|vQa1ZCiSTdOq-W6moelTR?beve3;=Ym1 z=7Ig7+*Bq#psV?uLD{BQ)KmS3Z&Smk6q2f(DWq8kWc<4u;O^3$-#@-~?}Ly2{Pv4K zu6_91ov-fAT)(@t^w&2xPTlqzf;y%YVB29NA*Uu}g9j-X{^u_yl`%b|77TArO{XEG zAu5ciEG}9Cp((>-y@r{~po)e&q!*j16t)9~?l!Uo)(KYaCxA&(<-GpLT4=|#Ipidbf7ANlj&)~ zeSGEtf@^EUHa0dInX4YszH=oQ+gNMugn56&g|*=Jt1qu~4Sr1l;I|qaDhG#Ffw z9WBR>TB;sIfm(p79z<2w+1y!|)l~h6*A`WGpsFqS4^{7&I_-8_*Bz+q6R^O?(6s=% z?i@bBFCU>Nfu9foN8(;QV+)DAB1uM*B;{4Pm_r_vqzlDF&YEE%NX5bk_%Fix0d5oX zoUr~|1hgXHRXdd@q59aXoKNhj5(nBnICP-RC&Ko2pxq}zNgf3&8HSJZ>-- 查找指定玩家是否在线 \n /bind <授权码> -- 绑定UNC游戏账户 \n /hh <喊话内容> -- 全服喊话 \n /cat <聊天内容> -- 与猫娘对话 \n /chat <提问内容> -- 智能问答(开发中,暂不可用) \n /status -- 查看bot状态 \n <必要参数> [可选参数]" + elif command.startswith("/list"): + # 去除前导空格并分割命令 + parts = command.strip().split() + if len(parts) == 1: + # 只有 "/list" 命令 + server = 'all' + page = '1' + elif len(parts) == 2: + # "/list server" + server = parts[1] + page = '1' + elif len(parts) == 3: + # "/list server page" + server = parts[1] + page = parts[2] + else: + return "参数错误 \n 格式:/list [服务器名/all] [页数]" + try: + page = int(page) + if page < 1: + return "请输入大于1的页数 \n 格式:/list [服务器名/all] [页数]" + except ValueError: + return "输入的页数需为整数 \n 格式 /list [服务器名/all] [页数]" + except Exception as e: + return "服务器繁忙,请稍后再逝" + page -= 1 + list_player = McList(server, page) + answer = McList.main(list_player) + return answer + elif command.startswith("/find"): + # 排除 " /find "" /find"未传参情况 + parts = command.split("/find ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + find = McFind(chat_content) + answer = McFind.main(find) + return answer + else: + return "请提供查找的玩家名 \n 格式:/find <玩家名>" + else: + return "请提供查找的玩家名 \n 格式:/find <玩家名>" + elif command.startswith("/hh"): + # 排除“ /hh "” /hh“未传参情况 + parts = command.split("/hh ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + hh = McHh(self.user_id,chat_content) + answer = McHh.main(hh) + return answer + else: + return "请提供喊话内容 \n 格式:/hh <喊话内容>" + else: + return "请提供喊话内容 \n 格式:/hh <喊话内容>" + elif command.startswith("/chat"): + return "智能问答功能正在开发中,尚不可用!\n开发进度:5%" + elif command.startswith("/cat"): + # # 排除 " /cat "" /cat"未传参情况 + # parts = self.content.split(" /cat ", 1) + # if len(parts) > 1: + # chat_content = parts[1].strip() + # if chat_content: + # cat = AiCat(chat_content,self.id) + # answer = AiCat.main(cat) + # return answer + # else: + # return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + # else: + # return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + return "该内容已移动至猫娘qbot" + elif command.startswith("/bind"): + # 排除“ /bind "” /bind“未传参情况 + parts = command.split("/bind ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + bind = McBind(self.user_id, chat_content) + answer = McBind.main(bind) + return answer + else: + return "授权码不可为空 \n 格式:/bind <授权码> \n 在服务器内输入/bind指令获取授权码" + else: + return "授权码不可为空 \n 格式:/bind <授权码>" + elif command.startswith("/status"): + return "---MCUNC QBOT---\n Q bot 运行正常 \n 版本: 2.0 pre \n © 融玩文化 | 无尽创意MCUNC" + # return "\n Q Bot运行正常 \n Version: 0.2.1 pre-release \n © 融玩文化 | 无尽创意mcunc" + else: + return "功能不存在 \n 输入/help 查看帮助" \ No newline at end of file diff --git a/control/notice.py b/control/notice.py new file mode 100644 index 0000000..18b00af --- /dev/null +++ b/control/notice.py @@ -0,0 +1,62 @@ +import toml +import logging + +class notice: + def __init__(self,msg): + if msg["notice_type"] == "group_increase" or msg["notice_type"] == "group_decrease": + self.time = msg["time"] + self.self_id = msg["self_id"] + self.post_type = msg["post_type"] + self.notice_type = msg["notice_type"] + self.sub_type = msg["sub_type"] + self.group_id = msg["group_id"] + self.operator_id = msg["operator_id"] + self.user_id = msg["user_id"] + else: + pass + + def main(self): + if self.notice_type == "group_increase": + return self.group_increase() + elif self.notice_type == "group_decrease": + return self.group_decrease() + else: + return None + + def group_increase(self): + print(1) + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + group_welcome = config.get("group_welcome") + print(group_welcome) + group_welcome_message = config.get("group_welcome_message") + print(group_welcome_message) + if group_welcome: + if "!at" in group_welcome_message: + return group_welcome_message.replace("!at", f"[CQ:at,qq={self.user_id}]") + else: + return group_welcome_message + else: + return None + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return None + + def group_decrease(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + group_leave = config.get("group_leave") + group_leave_message = config.get("group_leave_message") + print(group_leave_message) + if group_leave: + if "{userid}" in group_leave_message: + return group_leave_message.replace("{userid}", str(self.user_id)) + else: + return group_leave_message + else: + return None + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return None \ No newline at end of file diff --git a/control/private.py b/control/private.py new file mode 100644 index 0000000..01f76b6 --- /dev/null +++ b/control/private.py @@ -0,0 +1,141 @@ +from model.AiCat import AiCat +from model.McList import McList +from model.McFind import McFind +from model.McHh import McHh +from model.McBind import McBind +import toml +import logging + +class private: + def __init__(self, msg): + self.user_id = msg.user_id + self.message_id = msg.message_id + self.message_type = msg.message_type + self.raw_message = msg.raw_message + self.sender = msg.sender + self.message = msg.message + self.self_id = msg.self_id + self.time = msg.time + def main(self): + texts = [seg['data']['text'].strip() for seg in self.message if seg['type'] == 'text'] + full_text = ' '.join(texts).strip() + permission = self.check_permission() + if permission is None: + return "服务器繁忙,请稍后再逝" + elif permission: + return self.menu(full_text) + else: + return "此bot未在该群启用" + + + + def check_permission(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + allowed_users = config.get("allowed_users", []) + except Exception as e: + logging.error(str(e)) + return None + + # 检查当前群是否在允许列表中 + if allowed_users == "all": + return True + elif self.user_id in allowed_users: + return True + else: + return False + + def menu(self,command): + print( command) + if command.startswith("/help"): + return " \n /help -- 获取帮助 \n /list [服务器名/all] [页数] -- 列出服务器在线人数 \n /find <玩家名>-- 查找指定玩家是否在线 \n /bind <授权码> -- 绑定UNC游戏账户 \n /hh <喊话内容> -- 全服喊话 \n /cat <聊天内容> -- 与猫娘对话 \n /chat <提问内容> -- 智能问答(开发中,暂不可用) \n /status -- 查看bot状态 \n <必要参数> [可选参数]" + elif command.startswith("/list"): + # 去除前导空格并分割命令 + parts = command.strip().split() + if len(parts) == 1: + # 只有 "/list" 命令 + server = 'all' + page = '1' + elif len(parts) == 2: + # "/list server" + server = parts[1] + page = '1' + elif len(parts) == 3: + # "/list server page" + server = parts[1] + page = parts[2] + else: + return "参数错误 \n 格式:/list [服务器名/all] [页数]" + try: + page = int(page) + if page < 1: + return "请输入大于1的页数 \n 格式:/list [服务器名/all] [页数]" + except ValueError: + return "输入的页数需为整数 \n 格式 /list [服务器名/all] [页数]" + except Exception as e: + return "服务器繁忙,请稍后再逝" + page -= 1 + list_player = McList(server, page) + answer = McList.main(list_player) + return answer + elif command.startswith("/find"): + # 排除 " /find "" /find"未传参情况 + parts = command.split("/find ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + find = McFind(chat_content) + answer = McFind.main(find) + return answer + else: + return "请提供查找的玩家名 \n 格式:/find <玩家名>" + else: + return "请提供查找的玩家名 \n 格式:/find <玩家名>" + elif command.startswith("/hh"): + # 排除“ /hh "” /hh“未传参情况 + parts = command.split("/hh ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + hh = McHh(self.user_id,chat_content) + answer = McHh.main(hh) + return answer + else: + return "请提供喊话内容 \n 格式:/hh <喊话内容>" + else: + return "请提供喊话内容 \n 格式:/hh <喊话内容>" + elif command.startswith("/chat"): + return "智能问答功能正在开发中,尚不可用!\n开发进度:5%" + elif command.startswith("/cat"): + # # 排除 " /cat "" /cat"未传参情况 + # parts = self.content.split(" /cat ", 1) + # if len(parts) > 1: + # chat_content = parts[1].strip() + # if chat_content: + # cat = AiCat(chat_content,self.id) + # answer = AiCat.main(cat) + # return answer + # else: + # return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + # else: + # return "你似乎没有提供想和我聊的内容喵~ \n 格式:/cat <提问内容>" + return "该内容已移动至猫娘qbot" + elif command.startswith("/bind"): + # 排除“ /bind "” /bind“未传参情况 + parts = command.split("/bind ", 1) + if len(parts) > 1: + chat_content = parts[1].strip() + if chat_content: + bind = McBind(self.user_id, chat_content) + answer = McBind.main(bind) + return answer + else: + return "授权码不可为空 \n 格式:/bind <授权码> \n 在服务器内输入/bind指令获取授权码" + else: + return "授权码不可为空 \n 格式:/bind <授权码>" + elif command.startswith("/status"): + return "---MCUNC QBOT---\n Q bot 运行正常 \n 版本: 2.0 pre \n © 融玩文化 | 无尽创意MCUNC" + # return "\n Q Bot运行正常 \n Version: 0.2.1 pre-release \n © 融玩文化 | 无尽创意mcunc" + else: + return "功能不存在 \n 输入/help 查看帮助" \ No newline at end of file diff --git a/control/request.py b/control/request.py new file mode 100644 index 0000000..0a8608f --- /dev/null +++ b/control/request.py @@ -0,0 +1,42 @@ +import logging +import toml + +class request: + def __init__(self,msg): + self.time = msg.time + self.self_id = msg.self_id + self.request_type = msg.request_type + self.sub_type = msg.sub_type + self.group_id = msg.group_id + self.user_id = msg.user_id + self.comment = msg.comment + self.flag = msg.flag + + def main(self): + if self.request_type == "friend": + friend_auto = self.get_info() + if friend_auto: + return True + else: + return False + + + def get_info(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + friend_auto = config.get("friend_auto") + return friend_auto + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return False + + def get_allow_group(self): + try: + with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + allow_group = config.get("allowed_groups") + return allow_group + except Exception as e: + logging.error(f"读取配置文件错误:{e}") + return [] diff --git a/main.py b/main.py new file mode 100644 index 0000000..e832201 --- /dev/null +++ b/main.py @@ -0,0 +1,82 @@ +from ncatbot.core.notice import NoticeMessage +from ncatbot.core import BotClient, Request +import logging +import asyncio +from control.group import group +from control.private import private +from control.request import request +from control.notice import notice +import toml + + +with open("./config.toml", "r", encoding="utf-8") as f: + config = toml.load(f) + bt_uin = config.get("bot_qq") + root = config.get("root_qq") + ws_uri = config.get("ws_uri") + web_uri = config.get("web_uri") + webui_token = config.get("webui_token") + ws_token = config.get("ws_token") + ws_listen_ip = config.get("ws_listen_ip") + remote_mode = config.get("remote_mode") + +bot = BotClient() +api = bot.run_blocking(bt_uin=bt_uin, root=root, ws_uri=ws_uri, web_uri=web_uri, webui_token=webui_token, ws_token=ws_token, ws_listen_ip=ws_listen_ip, remote_mode=remote_mode) + +@bot.group_event() +async def on_group_message(msg): + logging.info(f"收到消息:{msg.raw_message},来自{msg.group_id}群聊{msg.user_id}用户") + if msg.user_id == 2854196310: # qq管家,防止刷屏。bot大战请看 + pass + else: + ctrl = group(msg) + return_message = ctrl.main() + if return_message is None: + return + else: + logging.info(f"返回消息:{return_message}") + await bot.api.post_group_msg(group_id=msg.group_id, text=return_message, reply=msg.message_id) + +@bot.private_event() +async def on_private_message(msg): + logging.info(f"收到消息:{msg.raw_message},来自{msg.user_id}用户") + if msg.user_id == 2854196310: # qq管家,防止刷屏。 + pass + else: + ctrl = private(msg) + return_message = ctrl.main() + if return_message is None: + return + else: + logging.info(f"返回消息:{return_message}") + await bot.api.post_private_msg(user_id=msg.user_id, text=return_message, reply=msg.message_id) + +@bot.request_event() +async def on_request_event(msg: Request): + logging.info(f"收到request事件:{msg.request_type},来自{msg.group_id}群聊,{msg.user_id}用户,验证消息:{msg.comment}") + ctrl = request(msg) + accept_friend_application = ctrl.main() + if accept_friend_application is True: + await msg.reply(True, comment="请求已通过") + logging.info("请求已通过") + else: + await msg.reply(False, comment="请求被拒绝") + logging.info("请求被拒绝") + + + +@bot.notice_event() +async def on_notice_event(msg: NoticeMessage): + logging.info(f"收到notice事件:{msg['notice_type']},来自{msg['group_id']}群聊,{msg['user_id']}用户") + ctrl = notice(msg) + return_message = ctrl.main() + if return_message is None: + return + else: + logging.info(f"返回消息:{return_message}") + await bot.api.post_group_msg(group_id=msg["group_id"], text=return_message) + + + + +asyncio.get_event_loop().run_forever() \ No newline at end of file diff --git a/model/AiCat.py b/model/AiCat.py new file mode 100644 index 0000000..0750ace --- /dev/null +++ b/model/AiCat.py @@ -0,0 +1,55 @@ +import requests +import json +import logging + +class AiCat: + def __init__(self,message,qid): + self.message = message + self.qid = qid + self.query = f"{self.qid}{self.message}" + print(self.query) # test + def main(self): + # API URL + url = "https://ai.mcunc.cn/v1/chat-messages" # 替换为实际的 API 地址 + + # 请求头 + headers = { + "Content-Type": "application/json", + "Authorization": "Bearer app-pqib8uic8oBP95XmXuBi5ANq" # 替换为你的 API 密钥 + } + + # 请求体 + payload = { + "query": self.query, # 用户输入/提问内容 + "inputs": {}, # App 定义的变量值(默认为空) + "response_mode": "blocking", # 流式模式或阻塞模式 + "user": "QBotAPI", # 用户标识,需保证唯一性 + "conversation_id": "09cc6545-b0e0-4611-aad1-cf9bf51600e1", # (选填)会话 ID,继续对话时需要传入 + "files": [], # 文件列表(选填),适用于文件结合文本理解 + "auto_generate_name": True # (选填)自动生成标题,默认为 True + } + + # 发送 POST 请求 + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + # 检查响应状态码 + if response.status_code == 200: + logging.info("请求成功!返回结果:") + response_data = response.json() + logging.info(json.dumps(response_data, indent=4, ensure_ascii=False)) # 格式化输出 JSON + + # 提取 answer 值 + answer = response_data.get("answer", "answer 字段不存在") + print(response_data.get("conversation_id")) # test + return answer + else: + logging.info(f"请求失败!状态码: {response.status_code}") + logging.info(f"错误信息: {response.text}") # 打印错误信息 + return "诶呀! 服务器好像出现了一点点错误呐~稍等一会再重试哦喵~" + + except Exception as e: + logging.info(f"请求过程中出现异常: {e}") + return "诶呀! 服务器好像出现了一点点错误呐~稍等一会再重试哦喵~" + + diff --git a/model/McBind.py b/model/McBind.py new file mode 100644 index 0000000..4f6aaf0 --- /dev/null +++ b/model/McBind.py @@ -0,0 +1,51 @@ +import requests +import json +import logging +import toml + +class McBind: + def __init__(self,qid,code): + self.qid = qid + self.code = code + + def main(self): + with open('./config.toml', 'r', encoding='utf-8') as f: + config = toml.load(f) + + # 获取所需字段 + velocity_ip = config.get("velocity_ip") + velocity_port = config.get("velocity_port") + velocity_token = config.get("velocity_token") + # API URL + url = f"http://{velocity_ip}:{velocity_port}/vc/blind" # 替换为实际的 API 地址 + + # 请求头 + headers = { + "Content-Type": "application/json", + "Authorization": velocity_token # 替换为你的 API 密钥 + } + + # 请求体 + payload = { + "qqID": self.qid, + "code": self.code + } + + # 发送 POST 请求 + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + # 检查响应状态码 + if response.status_code == 200: + return "您已成功绑定MCUNC游戏账户" + elif response.status_code == 403: + logging.info("授权码不存在或过期") + return "授权码不存在或过期" + else: + logging.error("请求失败!状态码: {response.status_code}") + logging.error(f"错误信息: {response.text}") # 打印错误信息 + return "服务器繁忙,请稍后再逝" + + except Exception as e: + logging.error(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" diff --git a/model/McFind.py b/model/McFind.py new file mode 100644 index 0000000..a6bcda4 --- /dev/null +++ b/model/McFind.py @@ -0,0 +1,55 @@ +import requests +import json +import logging +import toml + +class McFind: + def __init__(self,name): + self.name = name + + def main(self): + with open('./config.toml', 'r', encoding='utf-8') as f: + config = toml.load(f) + + # 获取所需字段 + velocity_ip = config.get("velocity_ip") + velocity_port = config.get("velocity_port") + velocity_token = config.get("velocity_token") + # API URL + url = f"http://{velocity_ip}:{velocity_port}/vc/find_player" # 替换为实际的 API 地址 + + # 请求头 + headers = { + "Content-Type": "application/json", + "Authorization": velocity_token # 替换为你的 API 密钥 + } + + # 请求体 + payload = { + "name": self.name, + } + + # 发送 POST 请求 + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + # 检查响应状态码 + if response.status_code == 200: + logging.info("请求成功!返回结果:") + response_data = response.json() + logging.info(json.dumps(response_data, indent=4, ensure_ascii=False)) # 格式化输出 JSON + # 提取 answer 值 + online = response_data.get("online", "online 字段不存在") + server = response_data.get("server", "server 字段不存在") + if online: + return f"{self.name}在线,所在服务器:{server}" + else: + return f"{self.name}不在线" + else: + logging.error(f"请求失败!状态码: {response.status_code}") + logging.error(f"错误信息: {response.text}") # 打印错误信息 + return "服务器繁忙,请稍后再逝" + + except Exception as e: + logging.error(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" diff --git a/model/McHh.py b/model/McHh.py new file mode 100644 index 0000000..c0f10ba --- /dev/null +++ b/model/McHh.py @@ -0,0 +1,68 @@ +import requests +import json +import logging +import toml + +class McHh: + def __init__(self,qid,message): + self.qid = qid + self.message = message + + def main(self): + with open('./config.toml', 'r', encoding='utf-8') as f: + config = toml.load(f) + + # 获取所需字段 + velocity_ip = config.get("velocity_ip") + velocity_port = config.get("velocity_port") + velocity_token = config.get("velocity_token") + # API URL + url = f"http://{velocity_ip}:{velocity_port}/vc/hh" # 替换为实际的 API 地址 + + # 请求头 + headers = { + "Content-Type": "application/json", + "Authorization": velocity_token # 替换为你的 API 密钥 + } + + # 请求体 + payload = { + "qID": self.qid, + "message": self.message + } + + # 发送 POST 请求 + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + time = response.text + + try: + time = int(time) + seconds = time / 1000 + formatted_time = round(seconds, 1) + except Exception as e : + logging.error(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" + + # 检查响应状态码 + if response.status_code == 200: + return "喊话成功" + + elif response.status_code == 403: + return "您未绑定MCUNC游戏账户,请先绑定后重试" + + elif response.status_code == 429: + return f"喊话过快,剩余时间:{formatted_time}s" + + elif response.status_code == 409: + return "喊话失败:您没有足够的话筒!" + + else: + logging.error(f"请求失败!状态码: {response.status_code}") + logging.error(f"错误信息: {response.text}") # 打印错误信息 + return "服务器繁忙,请稍后再逝" + + except Exception as e: + logging.error(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" diff --git a/model/McList.py b/model/McList.py new file mode 100644 index 0000000..2368295 --- /dev/null +++ b/model/McList.py @@ -0,0 +1,87 @@ +import requests +import json +import logging +import toml + +class McList: + def __init__(self,server,page): + self.server = server + self.page = page + def main(self): + with open('./config.toml', 'r', encoding='utf-8') as f: + config = toml.load(f) + + # 获取所需字段 + velocity_ip = config.get("velocity_ip") + velocity_port = config.get("velocity_port") + velocity_token = config.get("velocity_token") + # API URL + url = f"http://{velocity_ip}:{velocity_port}/vc/query" + + # 请求头 + headers = { + "Content-Type": "application/json", + "Authorization": velocity_token # 替换为你的 API 密钥 + } + + # 请求体 + payload = { + "server": self.server, + "page": self.page + } + + # 发送 POST 请求 + try: + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + # 检查响应状态码 + if response.status_code == 200: + logging.info("请求成功!返回结果:") + response_data = response.json() + logging.info(json.dumps(response_data, indent=4, ensure_ascii=False)) # 格式化输出 JSON + + # 提取 player_number 值 + player_number = response_data.get("player_number", "player_number 字段不存在") + totalpage = response_data.get("totalPage", "totalPage 字段不存在") + players = response_data.get("players", "players 字段不存在") + + try: + page = int(self.page) + formatted_page = page + 1 + except Exception as e: + logging.error(f"请求过程中出现异常: {e}") + return "服务繁忙,请稍后再逝" + + try: + formatted_totalpage = int(totalpage) + if formatted_totalpage == 0: + formatted_totalpage = 1 + elif formatted_totalpage == -1: + return f"服务器:{self.server} 不存在" + else: + formatted_totalpage = totalpage + success = True + except Exception as e: + logging.info(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" + + if players is None : + logging.info("玩家列表为空") + formatted_players = "" + else: + try: + formatted_players = "\n".join(f"{i+1}、{player}" for i, player in enumerate(players)) + except Exception as e: + logging.info(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" + answer = f"当前服务器共有{player_number}个玩家,\n{formatted_players} \n [{formatted_page}页/{formatted_totalpage}页]" + return answer + else: + logging.info(f"请求失败!状态码: {response.status_code}") + logging.info(f"错误信息: {response.text}") + logging.info(response.json) + return "服务器繁忙,请稍后再逝" + + except Exception as e: + logging.info(f"请求过程中出现异常: {e}") + return "服务器繁忙,请稍后再逝" diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/model/__pycache__/AiCat.cpython-311.pyc b/model/__pycache__/AiCat.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1e8862981e5ca0d93e0976cda882ed4a68f656a GIT binary patch literal 2660 zcmZ`)U2Gdw7QW*d|HQT9DQWDc$ke43sUxLH*rudO6OqueyV4RG#YH8GWKCu!$pm}s z%ujzTyK)Pn+0yI=HA@Q(kRk{{Z3&eqWZ9xVP*5Mol_ji^BCWKU{5)aQeLy^M?o8vx zkleX*=A3iy`OdlL+g;Ug6Y{SOOkje5j9Yysvn;t)r~P@nZB`Uq3D z_1SFb&xo_VfjDx;21xK)t&il0UKFNQvDnQ%(wZOQk??Q_FqaXJFj}9DBi=w@1z3F) zM`Byu-YLAmC@i_o8i$4Dho?;AG?7Np(s0@a(i%JjoJJ!h=_-T?a%t{W^gac%O93m+ z(h!1qCH)K_TrZ&zkN^mc>`vJajS5^x%5kUxe<4_BoR?*0h}TI_==M>Smrm>Uq$G$+ znA9nmj}1x=@F8JGGG0R{6#6xIxV670G>}mGPq3KA6C5AwH`l!{d0KZxqk*SE0J?N@VJ|R^0}DHgcoi;$X<7w&5?4Bt1 zP%gnr9ldDdRd7}7a|k=%_Iuk+?6!fOc}3vpHnQWYd(m#B_#a2V2T4z7oSWeJ)6R`h zUWHSYah`EvG>bb)oJ6O{SJ6o#9OzE%8CH~}+}hB<2>ar!Dzf`nvEf8h13Szp^^cC7 zoT8azGA6K$A|%9y5ji2Ic6afN#7iL7A(OCL=AbmzTQeAZqBbBKh4W$GSYlvRn3GBPU& zx`Pqrlf0zj8d_|~xOsW$^V^H_|2ZTH!UpV&N*X#zBLr~SZQ}jJY2ytB%VqpWJRa&j?nF#8c)jl7Fl5wRgSW_63$p+ zXb2aW62!rTP7d*k1b;)MQwo1d(JPLeV)-QARAHBd4}(ssQcT*8IcJhN9ZN8r4&JQd zt}8RHk%Y^m6TFPK0^IjzleSYMe>GxvEd7|8`Ad7$*MJbg@~j{)3{+8=A`9@Ny$wrI^S zwct_c zIl3oL_h@v_T2QmYH{uXmS$KhAEin9x;oDwBHdya^y5On0_&2TQ(EL^)&~u*lyr*6B zv=^#4t-SvNt!T#pz{t2OR~~-g`1|xP`peVh6rEY{!3Pd?KS! z-5tfJS&d=d6OE3lOw1aQJb)za1M(S?@UO}&x`dCSN$?*{ehx^s^b~EBeMb?Mh`Y{? zSG6&e2P>ffrHqX{%q?1zsacS{WoiG$0`5- literal 0 HcmV?d00001 diff --git a/model/__pycache__/AiCat.cpython-312.pyc b/model/__pycache__/AiCat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0360f03add68be21db5e4deb535202688ffc1226 GIT binary patch literal 2445 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 Marpwk7)~qy0X;SB1poj5 literal 0 HcmV?d00001 diff --git a/model/__pycache__/McBind.cpython-311.pyc b/model/__pycache__/McBind.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7464a0cf440fb1f52613477d2ed1ba35d42e45f GIT binary patch literal 2534 zcmZ`)T})F~96$G?^qUqD3QQD5v(+ipfm5pkH+9no$p~x-jHIc(7buqAa__A`*Dm19 zY@9fqWcUFAlZ~;cLl-l+pO&^+@kSv)k@MIT!AU^GXZfW@t&bjx0{$JuKR(+=y2L5inX= zS=pYz)DW40W3x1N$xPqm(@;M2J}lq4w-F2Z=H0 zeJhI)!V3d+`C<^rt1m~pkwABm-Bcs$A_&xo2&h4FbO~-I9zu+21unIwXU+;wdQDID z3QrZI2~sx@qYctPb;GJq4xzmA-5Et%nS9GZAi}VRB_Zrl1~`BXMKK2cfNq-xAWTfmayRt%lMF zJ13<3LWj}PTo=)W(mTd#sSOw_Y%b2*;%==Fxekv^@Bx)yY}vWbO2``43&+dtZI$(> zSr6xOi#-mvPc~)+AIFPwZdMezQ>-_jZWBeH-DZ15*aKSIX_xJ!2hMxI?DY9OZkJPZ zb6#7!z>4%pSKVLs__>STg*;eFe^v{|)SX zF`OL!a(cAyd89va=W1eTJQ@COX7XHeXvDt@>@yP&lK0LezP~qf|A!Zk`liqSn(XZZ zcYE3AJS+G(ufSFaqEqw>4t(*1{CELp2d>RbOgx{wne3aem-#p2I79u3^EVUM#;1Sl zOH5vS@#q2|PmlK}E?rD~)j!)i>@UqmgYeViUq6rBNu2wA`r_Thqce#}#9n4K%QWX> zy)vz=3+>^Yj7+t%;^HkQYk0QP&k7<;ijNaSna1-fs~CTWPmuLX5|z~+uC*1fB<=RL zaI%W!d5#BYwp*07N4s6D53h?=&ubtrnP`!7(wl-efy|pR!6#6r{Je)Rz?|CW>``)p zB+@e@6Re;I6WqI*!sDYV(;ZH?H=tj*V6lMRguh``deM|I?~-k_@~%ZP?vEPx$Bg?^ zh|q3{)J+u>4>Vrwyxcs{9R4sxfle_flGca;vZErQB-xMmy3i z&@csPrM7tK+bI>5uS+2yVRb4OLHftw$rw1kOm8r2_fARn2J(})b3p*Q-=HtC!~`1BAbE07d2GJ4AqjMI-dWowETk!o=>TuH?#siL01Z@ zsQdIj^+RHx`i~7&N4B9q*KNYIau?9Y+jK|ssK++TQ3LhFpaQg zfEU{D!MwrY==3{1X$y~UaefDopAe6CkFv9P{F*2Pzx={GKzg$^MUtvw7*vL6-crFB zUnglejAT{u8!#Zgad~`<`C?3zAb4zxfnRA3rt_@kcY^^oG7>%m0^5`z;>gsi)Hu@j cDm9LBdzG5ir0AUlWb-=t59?m8Vo-wr56Y#HZU6uP literal 0 HcmV?d00001 diff --git a/model/__pycache__/McBind.cpython-312.pyc b/model/__pycache__/McBind.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d77baa13a859321e911fc82261964c3d4cee5f80 GIT binary patch literal 1806 zcmah~Z%kWN6u<8u{R=H)LYd$?VbdC+*PH#AbX7*0+to!l<9ddT>L)={tXtM=$DP!7@fdTZu22d;~ zH$-1i#ts@n^ss6hY{>CA5m4}f$+Z6jE0mN75-iD5EIm#JA?Yr>VGn^dRnjLNECV|z z6%ygnWa`3c>>(%%DXP-OuH;pxHF@o)rc(KRoiUXvaFFh&yR^IGu*NFhc^>LT_?7?T zS0(+qqAtC+3s+?ivFh}R1oEr*iPik~NuQ$$atCD}3@u3%SoAaKC#ooI|IpG@X+a=p2ic&XAO#?le4oNFGw_N7wsE&;S+uMr6fXE z5&CR>?owj>y6+J9*QdWr+`bt9^7i^S zUp<%|T)X^jVqg%$twvuKxHmo>Tc4g@ox713oCeboj5t0VzkDM;7Fqj#Fg`c-VD<`N ztVM?7S4ZL>3~vlf_zEB6!a-}1k5;3%;+K9{8<~mEUW`YhR-;L?)1s1+=X!jcAi}43 zJ%T9F$@(y?uiGm~8bP#+KEa0Do5$~1qMhyw9*GvYK2cJ=(dXd2xTvNK9`}Pp`FIzf zjU|QG?ss|YEXEhS9=E_r1SjAU!8`!sao0$6x83OuXi}Yz6>JtHU<2s)tcnn|sYHe5 zSfTkLL*=MLip?zaRDQT&v;k&8xN)>GZPw~lmX*B2;oxX+^7PDeKhZy{@2Kxuetqrq zQr?+R!)6B38DP`jjmC6;IXdsS!HLL_9O zJ@9eUhfNEIEKy=cSTMZ2q^(`asrqM=0p}y37(VX{YrO*9DJ%y5BUwkoGOtk8ms9h4 zLwyM~U&4UgVq)-oblbZ*n@v*NY%n~1E-Y(pwjQ6|C3|=c;PFOaHxZ8qOtQ8-9$`s_ z1p(WK&=yHD`P<4Pj71K_E)&D!4&`%!Nes+ruRnR!G62qX2UJql$~nBs9|H%TaRUC$ aY*GY4+()|mNb?&q{6!xlEL#Xza_7JAytm>2 literal 0 HcmV?d00001 diff --git a/model/__pycache__/McBind.cpython-38.pyc b/model/__pycache__/McBind.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebb0610795c0dcfaa80bb0f1cdb8bf37b1272c06 GIT binary patch literal 1502 zcmYjR-A^1<6u)=o&g|?LP;9HIHNp5`_Mu=*G|k4CDmBK3l2jz68^iG^WLxMo>w3GVyP?uQI#v)b~C#o;yn^cXH31-#Nc~?zvxQ zD4)+DXuqBv8v92_=syXLHWk1*=)t=nD5BUwrS>0}Fkr<|Ce@OP+cr`nA0w(#auZQ< zLn&z#52Av$4`b0l0Sn#nMn^4Hk@#p+0Gxv!oCaYb8M&lTOqH9cq_*Rg2-P5#F7ykP z4{euLWMVQ$Z>owF;^rf#p;g0W#A-+(#@0 zzo)0q7e_AkT=Dow=vGE1f$NO4XYBQ-g<+buYje|-+&~USSjV-_1IBZ21xwFC%fer7 za*|v(csOh$Rphc7>g}#N=6F?!@EWcwm(V-tBKi~!L+Yz4)xf4EnhqLCv=nF>H6ryc zqUnf$%&cg2on|AA=9ZOuDnjD~x<>PWj9QiJ`2KXV*uI6a>8pa4b-Gc~lp1ve;q8$fj$6d6d957A{0?#cH#5*T4inq`FhqJ--t@W>Vw;sf|{%S4!7H`kSTU*7R zLYE+(Z@Gdb=RzE>OocjX@fUAL7|faqt$@R(_+G#Tk^3q%8czCw$R0_Q$yX|f?N&XZ zS&VrM!dln3NPl##V)^n+3Rwn)2nk#jdiz4K9AK80LM~INA#>OhiIg&|2~vTVEZ5e9FAK)4GZS2GwsrJE>Nd8VfbCeL(T!6(74OApqS4DOZ;VArw- zuUp0$C}^?>xaCR9G)2ZVp+ba?)N`ge6_%a0hoxaA_NElFQXCO7B_`{YTx3!~3~Z3Z uQqb8e(t8So(4YkQ)5(6Z6VfWj9Ep>JP1a|;*UsU6S#$zvf`~YW4ds8WA+cNl literal 0 HcmV?d00001 diff --git a/model/__pycache__/McFind.cpython-311.pyc b/model/__pycache__/McFind.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8a842d20296549ce5381065e14f91c7a3feeb43 GIT binary patch literal 2952 zcmZ`*Yitu&7QW*dzdiP_c{mPrNCEBEtia17OGsNow=}d;$qEuGkw&sy&m>Ih%$S)m z5X-Kds%l*dRklqP9!W7(OS1wNDs{JMiWyOSMLdgtR!1U$~+_B7W_;GqJ%T zx%c|qbIv{IyXT(!@O(+r4g}@u?bnW3YzX}i3zb4GGY|FwGmcoq5;4?k^h7VA%cfqF z-jltg2^~PJ=^ez9S4@BiKcn{Z0YamM$PgDWX_U;x`Xvht%h!Z-`3Yi72K+BFn}4jG4B@hc#O`%nQ5{4kta!%8J5@QD`6;RIG2xQfKU0 zs1HDaqLoEq0o&;zjshJ=%41_J!J1g|8g&Imu3{U#w4pSiR3(H4s|!vMSHSyf6(Nli z54ASg1QMK^&~_wKCrziwqv#|-preR@nlj}c!>!DR5Nlq6ORi~YSz$@7X=zujo_7B(UY9oDOX2%-)R?jxn?tR*sTFbVP^{%jWrJR!M@w~&nG^Jb@(Ii~B6?)&K zsT3UHV6i!gK_6)~4jea4a91|rzsoUtU6+B(mV_bygBw3@_h!R=6 z135{w09m;4&D>XS&t*qTr!U>VHL@@>R=W7<{P!QveL8Xf)`dlUr#ivi0wKT*nu`)-dL&z7#AD@{yk7MYVyaFT9fuq#ax>%kjL z=f9h|f9uTL`x)TpCeD^lUoM@Wf*2C`&S5~^B!S;~Bk0oSUoCw71q3~R`ag4-k@?(6 zM{B|j!;53*7jE3RH*#W-IQUYms9E{VY-WI~Ebb(pipBg1+)5QH2T1sP63g$v{TmVDR?r%od{ z8RN9p6bZkA8Z{K*g`{)&j|vO;pIr{YLzh9b^t#btZs$#}O7F?jdkXZPG9v67rw`3G z_{NT&JN}QpvA%3)nFO6app)OQ$?upv(yhiVEiJ94F58gTKR)=;V9uX!3>F%LS!c1S z<&xuqBeyr-w6oB(GfNkJ8!k0pXjV7x%KO?1zP7CUu6zGEr|RAhEjMKJK(i#E`GZCO zpUY;l&QV4{vevR2(RHKy$6hIuCS7(k+IP=-H;koo-8cXAGxd|>&hGra?!vxq)!UQz z_7uE5*_X=}#55H=n{x6mo-L|p%Piv^bE*F4^Gv9~gj6O}Y<=cS`ZM~n=X1{}t&dLj zO!Q9C(~&!z>hH<>dkR3ABL(J&${e}t`{S>^Ex-7-Otq_R2lKwJg0E}TQe0hI=Yz=C z?JTxzoZ!{mS+wZn8PY_7{>); zp{Y~X($GQ6GkXinUX|Hf^meG;j-`^Psf}mJQ0Z*BNBceq`v_9Cz9}i)ep0TUoM^K zpKCin%2aFFM3^CuRbts{hDAO}3^xlm8!nA_2(& literal 0 HcmV?d00001 diff --git a/model/__pycache__/McFind.cpython-312.pyc b/model/__pycache__/McFind.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e67b6634a052991d5b0559118f3e066519b1d4 GIT binary patch literal 2227 zcmai0eQZ-z6u=dyLlZwY(3YOKUbl zWT3+liDfciM2#f_2MKD$CBul3#D9t`VLmV+aj)I}Vz56n_>cF#_HBX)H|e>*d+s^E zbMCqC-rHZSRuh12`nvngH+2B~fd*P53t(ay1WCXE1`C6xe2+C@aEyoX7NUv301jRU z3~>-JWFMaQY9eEpn;Jud1~(?_!ja}?mJj47^AalzCL9nX0Sgdk6V6}#^JXpUe?_H2)253D2m0H|u9uUXV$~FZ#!>!v#unpcw7{Hhbwnwxdfq za^~JZ`{>|t<>cwy_aA3Z_uL!!bPOGpwa{G$lY$Xs3(E--&(eM&5Ddz?2p0}=tW*ZA z^3bJRNM^tKdL-ScTsWchq-34I@_SicHOa%rO{AI78=B^>4Bi{~FnhQS;%rZ+a^$Si zoq{pI;ii`~^%pcjTLFTYIjzz1Ah6b2fIod$hlQWbkaZy&tNc zhpI`!+;{EDU^ff|IdZ8^rR%8je&<-*DQWg3@95y6T^S=aPwIiQdMG3$Bqrn|?4|_ugFDI8?r+lJ>rRotdvh1Uf-KYZ@&Ka(5%KG`>e{Qm%*>6M(v5dDZOWLLS(PcR8Yv_& z$Cq~8s;R$GQ=joQWM*v|vcFl#;RKi3+P~x6j?|_?mgTj7jo2Iy01j7bDgJ1~;SHG? z-ZXYm$T(gZvaGmMQvLTh1t%X0FT(OASA)7m;73Ohk_%Rmu)DU%xTc)Aw%oC%nE0uf zg1Es=q1O$)i8L*nXc|6!QW#+iP4AKX;rtAb-U}YFo&&rYVYER!r3nNC3ls;z1018A z6T117H*bih+!SAqOr2236ntT$G4(sk6S&dTB&lpzk0B2pk zQz{C9E0w4OrAf&lkW!%%DisJNQeOER_6dplE_o`?eE?>CO%$=G9nZ&aXJ&Wi=4`oK zK(Kx|es;QOA@r9L_AU*C6R@LKfKWuShibhqu3?agN9MGehI=}_roV-#M)j+R>K~Gt zLGc+>F}C3>8mnMwdco8b<8>wPT?B*^u%p937*d{VgknmrqMFw8SJSBhzD#MpT|ede zw64zVEXAvR5_Y66l;8x}kQ1E1DzNT5bF4z79x-o{>wvh6xCx&phu^49oF0BZ5EHRq zpO_0M^Co%`M#6b%*|zJu!nSkDa~2Xe`k&f&Y;_FAoz(}7${FeDF=HlXk`uWVE3w*`_O-NTKFQDIY5y$Ye~ZFOkq)#mMoE4p*GA2P z(umxQl@#bRbdWyV(lToSve`$UYm;U%QT!0y4}2*p@;_BH$m02=bQ>*e$DEMwF-n4ym(d$8xx zx4ObpKzvX>ht4CPoa+_$=vbpXGFlJ(Nq1^Q1aqFmykW#*^4M{xy2bo@KwW=I7B4a{ zsJmj`c0*a-6~cfE*|#f-V3zrf+_Vs3b#(Lzt~UBdFV;sVq227zbLJUu3^-xvxphal zfj>GE1%8DzN+$zfFkc*dcRpmY{CX^=1MW65OxA1Ac)4ljP{t#vQ%5-4e?W)CM}cgu z{o1*IrStKPbn%TH`Cj9y1#$XxwG_m+^b7nhH-F2lI z_@3*tcnDBEb~wHFW#`AAAFa32dtaqXtI~`ZzsPt7>9PNZ#E0NCK)Vk&A8<`Q$S2 zouyW~*iLV)LJn~r?8;#Vi4TI*OFI4T{?>!D&Pamz{ORqibUjHfG zxRS1~SBES8QV&ArOFgTz?gb8&+7uJn6HAM;3o(lXyl@yqLh7nG(xCBN7|CKJ91%x0 zbOYn+Uo3UkpA4kII1e~@WS4}@zj>+7LRHvGA2$>TPfD}bTf7J|FDX)17A@u;A5dH_ zbmp^EAb}_h{0KT=hqG0!xvCD|udtY9Gp9$?M3MTOI9R2 z%p5`bzqP^P!=5Gmmj*6|=2AcJ^NA>mY`_;e;Ie`6Ix4K6kEY+Dv=8>U+9DZXUe z7h=cjSvbsl#9vZGO~O4yrN-6dSNcfxpoJ|h(^O2ZW;9p5D-9T%;e7U>{D9J`Gkg4G XZnJw@ul90yO^wP(1qP3B4~zTp$A~TVCov<-zFZS)?H(5+RCr1#0z95GY{Wj^02bHKICAo2R3Fg~D|Z5WL=7+kQ}#tDVyO0x8X^X^ zCTs*tqhwoUXJjqaYacZQoZFFv4|=KWK*F{tEj5&R$g-wPv$YZWQ#7Nh9u4mni=y=V zH2ag@5;a1MpyFOa-j<5L^*!Zm2r70%FRIdPtY|i^(J&>AhOLX3U?*%daQCWw>npyS zd(lfW-?G|cy*a$ZuL1lj>%N{Jp7Z~A1s(RDFumL9;R6HS!QB$?_sN71R)?g4*IONg ztm6V6p7jO>W#cK%$9ufesLLCa=?W9%1xYqnSc!j+3xu^pk`!!nI-e75VU6>Y$2l|< zwzz{qpV#A-ynMhpEb;+|Ds1ZF0}>aIUOzq>#-mqe$yj;KNR^BL}wL_en zXG_R-Sq>$%w1#c8=K_qdfC7JXF zBv~!+p#UrE51saKLA;}~*2fPH;&Y*r*x$bl~_%H{!H@Vh06V_k}Z;6yxG z_=K%00)G5t%J23D!g}R{g-Lj`kQjnjVhkH~J!)lTWj%30hnR-R;g5$C4XI7e^d@J_n5na0 zHB1{4ovFG#>AF2JI%C^1q2Y&7R+cvUA#5JY>r2&Pl|MVgC!0>HL>OgP$KyQ*co??!t znd7l{A6qxa-;Q+`C=K1d$kbonducR2IzeUX?THOjuT5wdn_f+f%oC}m=5$l@gn7ce zvS{5>Kq|WZ1uR;aIGwb=v)~4Rma-g7TMi~I2Qy4tvbw<{trXPYje7&K)TL{-C&ce+ zb|!0fW|&td-hW(cOV_?KYyGZvSF(0jhUrN%J!@r$=0SR>)GUYAs=Ja**MBvrwhkwC zbfGof{!8egr7XwNmSaiFu~Nbvv!`!HllBg1DNASC(wVe$7E@ly*3`lL^er!7(PX`F zBw7FVLK6VAl&K?a>PVV8GS)Yf)vYv1eG3rc035$hHtr>FQ?1%>h*s^tw*2g{72T(I zbTy;` z9Bv~YwW)#baj5Y>wt(Buxm>cr<$^zRAs?nqF4xJB+gH>G_~Roq1AK`Dd^wbBBj7(D z3gAD9B36%8YC)w^Z-u2OgKobXR_4c042L5*)PfxcY{c*?hRqn1LEgkvW#H$!w~Bdo x2rZz1M-hp?0f1Xb5E)c6rqm2Fjwv;R%wtNeND5R30onW*zQ?j3)=?;f{|`Z?Jjwt7 literal 0 HcmV?d00001 diff --git a/model/__pycache__/McHh.cpython-312.pyc b/model/__pycache__/McHh.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..124c6b65ce236c4cd347b9a19bfde0756320615b GIT binary patch literal 1650 zcmah}Z%kWN6u<8u{ZH$dw3&ldSk$MH0wc6kG$J!@Au#9mVQW}k-um8XYyUjnAE8Za zU?HyJm?JT%#4R$T2@4unViXMt*)(y9UpggOeZ#~=O5xKOe9+7<-uoWKK}>c&oO}M< z^SkGsd(QpYW-|jwPab{H_ZtbopGYYa)HT{{flCf>fWx97ps!c}gE}6?V?=}63`v3S(z*W3_8U`MNVTKrcb^$|mCq~jz59Gb&T?c_!m!TemYfV!-F;2s7 z&QR}CNsGP?U;|)~I1L6c+SZeDhh$msdpym}jSbC*ni`r~S{uBreqW=n$@5Oo6AGmq ztRO_gK~@eY;+}|>degY!nKv*8EASM1z#B}j$SKHOqISHE-p;mpT7t( zN>gLS%a@Apjjat`Rcf|zR~IgnraoAn`>J^1`_iS^;{5sI+??M{TmG9B)hP1)3NOhp zOCcf2DyiL^;*^*msTN6QWkq6waC}76R4N&cpG&Bu%n!<{>Gi=NFQ9VK6(VX*l~BZ} z_ym#+0-KB`SPtP!LLx5lD#lCb_HZyEiKvBDGRB7EDU&vYNJK_y9^&`lhQBt=L^mQ%Z}=tW!#dl_075NwsqfW>(2Xn^81f1I^JB; zT_4A%PR*RTerD=eet-L-2-5BXZG{h(=1RhD@d4 zHz*{vN7MlhBG)#kYHZhYctv~$I?z`lp|5wiPbjA39Lg)5czKm-5K9;8(c+O( zQQ}%3axWwF!SpgfeC#6w`2;9L0x#U3B|;gusEAZd&nt|WSw*OxSsrF8*fR~tO~fLw zJnBB28#>nWuEU3_c5$fUP_sNFQ|@;sMAR@W+v0{HEj{Uqu#Rh~P`|D#Vkv(z(y+=K z4zYa&8V+|zi9FMcaw${C94`INh=n)e}7FCurs@sV4`Kol_A{jm6m?7}Zl4)pqgp!WO#KPhCUvWD#RD zh~7b8>w}1P4Z!QyQ}3ltfW#(%KQ@}7&x{fF4`{aybogh-$Yso={q`r49igO$KIbRl zB+t()gYZ_NZ+ED932b)`pfK+)DPPYVN_NXrtV=p5o}z|KUp~Rz{lB=?|Dp~nWlw)C zwZFIM*u&Pye(qGt0<)S{<-_|9Lj6WfyXa8M9ubL?X4xrPe8R9?k=kHfhjEeKV7W79 z+Odzv6kNA#6${*Q?A}q&v9qL>>~m~x+I-*J6Rs&zuT^=; zVOA})$&$P>{^sGZQlXY3C9^?+b7>~Hd@=Z7rhR(8{ksg7 z1QL8P-CCY+OkED9uUnr&j_Ls!;LK8E?z`r%9|zxGJ=%A?zpt^f(wMr`y8CTo>V79& z@cvXs4?)}KXIjgjTeqcq_eM}a7_8me8(g^g;J4Yvm3!?gcXI-J)~qypal+0_kId)TyI`I2gsVYKY6%18Ak1#d)<7pIeo8jda}7N35S-SVf(Y$ z*7EX$wZ+Eda;_)4Rj7_@+CmLqSuHySDwGkEKkW!2%FOYq>2bJb*YUVeh`oNQXu9%6nQTWwGZ}N3NO-)!tDXUsV`kG#mnu9g^iGj6dC4p# zi3BN>Dl4~xY0XIidG7w(dN zpsU5gh9_h9XEoUs?Lx&g3=uaBXqeTq+$RlVyjm!CG%N<$*)b>nOeQk!p+QG>C&G(mJETE?x4bL2XrGw#BC?n)akvvrrN6Ej{5D@wR literal 0 HcmV?d00001 diff --git a/model/__pycache__/McList.cpython-311.pyc b/model/__pycache__/McList.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13f0a1d608f8fa025f77da394624d5e3137b06bd GIT binary patch literal 4845 zcmbtYeQXm)7N7O5?f5IPiG!UF6Y~{t5@IL~DJdlFK~i$15fSNE09meg6C9kiySoOG zTc1MJUeg{_z9UkAhBlmfG!$A=sqLjLCs1`QaJ@g)$fsH>MXFSskH6}Q{t@xd-JA7C z;y~2uZg>2fnKy6VzIpTB%uC)kne+&r(wom6t}jIB2i(a%RHkw7322NU8qq`mb){>f zi%|NiE|pS~U8D*Zk?GtkgT@GA5S9uO ziC0k-2&-nKGdBI06nvTDK`}fu;vqeHgp4_mgf?ifW=nPVb_Dd>R!!z7b zhLfp~w})|&GQ~52ZcYpHxB>tk3v@c2_gC$1JlNrUDJUE~>ciLRL98|(J_KR zFCqe7Q8l(mZuWZ!(ds2~$z?e;OE{@zIkihT)pUVKzKv*|NCE24t0NlPAgXEOs4Air zQE%285wz7=-Dnex7U+;*%2L1{cmtG2)QDQalI_6=wzcwz1^HjUQkZY!h)&e?Dv^QN z>7pZwjiUtjm0(Ltz}RcdwrO*|Jg}v14Exgq&qbhI&QT-!hs#?=YdvkDS6nI1*Y$xf z>zCO@D_xTB2@!+19PdinwuINXEU%p|UBYXE9VyQ(GH=K7wT%>tg>=~futthl_gW-W zEX-PmxHS=To_&h4qjb4wejA-v98noqEVnN#4 z{B;nBUKc5559tuSe$1S;*W#M4dKC$47bv1BU&3yb@1yynAp4j1X+gXHVXgEA(E#?{ zC>8^{#3I0I(E?a=UKg>7*8ON1OVloo*@t<@GV?aUycJn{{Q7w?D;MGUHiA8XJ^V#) z{=cl`s%sxG)wz8^w%gxRCj|QfGQka~!$S9_$6SP5z_7j`?Pq&r!%-#>^!bH;k3S@v za-C3+6Xe2NR|p&c0iFA(&;4?k;ra*6-cTsu_jv_>kahR+LDr=j zFzyPn0>cWMI{QP6Yffe6 zer0+nntb!!AFrL5y*`|L`<>neji~o%}HQ`WG{AO(d_qlAN4ubSlf79zB(O^TN#M zCz99C{&?*qOqdxzm5jcX{KKia!SfuxQs({xPZ&EwnmKuP94rvVH;*&7g3j>j#SF^{ z3}YXjdFxX0qtB8mvlImF~xBa)gQpfX? zmdP!j7fajPpxjuQuG0*Qk;9e@mjERHemeQashm-huYEi{`bHRM33n$yNE->ZL_a_| z_09ufY>~MOpSrV+Lt&hdrgu2`-p8|_{1x1E=FQKh2T#n5oq+9yR2j_;pPjvW_3rfx z(dz;IrHfp0U% z1y>1&^BkGzmNn_)fy4IzhZ7+V`-n`2xd4Z)Bx^(7ennGIjSmG`9zr?W^5CH5@HL(Z zA)GODINp>@SuX4ja(!MwU}z5>kqJgFULYx9rqH!~*ym$-UbZZZW*kM5i{-4;d2nRqyK0 z>BpL5_N{UI)*(}(wDR4ub7j)HM`NY+@zVOC!tV>4&KRV^CMaWl=^Ai|1ZfU;!cmh_ zlg0WJ0vOV!3X!dR_z3*zFx-|$H`ePKrfikNk+J;~8@{Igp}*A-dt!h5iT#qTGiK|I z+d7B#q%_EEj~A^S!p~}7kB!irbLD7yNXSB zDmINDksg08R`Gni;`yj9QMTc`vYI<(HREkk!@gKqN4%^fs!dU9%Z{n?RcD0J{<1J#H_7xYpY~!O_V<_l4U|M_?S$%1=_69@DBdHDI1KRcEyGS;d;MVrjsN?Uh#VzF`4?60^3%tu2zZB~jia<(I5t z&5B~kS{`lA%&w1Fx5cg7B^H7Y{@=37aEoN~Zm8-{i)4W4q+o2PJ0i zh?_ekb4S)E#}8lW1J_*aoyyRe7e)`o%r$XyjbyG#*cv5U<9xEn4hz*aEWnhp_~c%x zbjPFx07}fbGj7}|8Fwa%w@LXWvsPULH24WPKTelCN`68;ru~w5O#4;Eu7anl(AVor zTbj|=O$2T?>sxEcZ*;cSD)JjA1(a{9)R6Wu9k#Yc^7f;c^LC>eQ<{sR{ml-UKQfRNfpVMRgDasPu6BNumF|%&4O9 Fe*vJf3XuQ+ literal 0 HcmV?d00001 diff --git a/model/__pycache__/McList.cpython-312.pyc b/model/__pycache__/McList.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5472f35fb0472c85529b81e8ac3373bba06b5d9a GIT binary patch literal 3843 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 literal 0 HcmV?d00001 diff --git a/model/__pycache__/McList.cpython-38.pyc b/model/__pycache__/McList.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ff3e6158404000011cfe97d52610ea81d7937f7 GIT binary patch literal 2570 zcmb6bU2hvjaCh%~K09{eIQ@VSN+{*SKoed-5LHzX-x5SXffN&TI=q|YQs>Uy+bfNA zhZre5Nt#yhz*;vuGdnvUyEC(X zF`v&O7=JwY;@JJ|Fe_s7(16$npZ@>=iYTt4a%;wA3^b{d39YQ*7EdqhPavvM{Wzlf zF;Y%ZydRZPtFRXhmasIc-smXf6-93z1c-g``8@y_Qku(zVoHvqvewd9)@cfK8Pa&B z^0ecNit=oIC|v1y1U|n2AjBcEP)GoRF4%_$&k$+&j2~uP>NR_ml{BgQtUAI|AkPf| zXAn1G`m^WJf#K(RU-QIp;8unwJj$xWEu($4NoiV^<2u5!(je>W01!5Cy<<&ceYJws z%G%fpvpVO*zhA*q0Vhd`ifmf@un=K^=ShegI3h#ne)JrA9vuMh=QWxFo|a$+V0wb3 z0ZUOc)J`Ls33Y(kxm0A(wlGC=vm{D~Xk3RcMe{(JGo)S=#&|k3!n82wGojhQw0&BO zGGS&sOFIsd8N#0wZSy%=Xkd)O%)Hq^QC4w;Ii3l#w38NT*R+B3}v^(l_cLBX4p~vVg zDsniF-Z^aubnQoBF6yMWM#XEapW9?T_pjD>UT;0jQ*_V-o4+ULber;(?uxqHa=nM% zK3|}B&^wPK(HZ8C;YZOib(3A2Y!bfn|J$T@g>4W^DeMAxch~{&p0E?(y>pppOSnbF zmw2;V-Q)TRCY(Ot6gP8#hFe$XOCdJ!Y+&s!2*0@IS$DGY`n%AT{Ixfc)KmXpJ>S<~ z@!Sz-v`=^wRf%~$6^N1D4?>-r%&mCTaYtp_VOI4jj+nHZn#^wyHIEC~zCjA_Aam>K zF(GOL{r!L9fqJI@aHaoH!1!dnVApC@r(z4obNk1A&n=O9?h(%w%oV#|n5;3Ge>f0h z9(U@A3|BQ-A~HS3Y|6MVb!rQH^*7)KI{>Vl|8e=ko6GOc#3#PEa%pPi^2hP%&znDg zwEX$(l}n$ks@;#ncEfQgSdcm9`T=K_?N=N}=4(}Zl5xuoCSGGaxEX}6;q=C5KUqHa z{nFxeeD>3LcA=aRp0KOWLcG6Z@8#?{#g;rHlNsP9FSh@U8bK(7^ z#k27{7n>))jW4|!FD?%BCSfkmPRA!2&7Y>?%crhf`T#aG7pCKxlkwZrt4HU!(zN~cF?@%jRz^hzcHe{?lnRp3q z`8Ch=p%T|IOVu2|0mRlSKs~u!RY3C8mfJ@>K4A;NsHIjUX63G{tfWd5znu1iN`?7; zx%2AkTA@h8cKz2O81-mxx^-P$tIA>D1%Pk?Z_%|ONa=JB2&%Y^?=AM=hdsX@S$_Qu#?@jU#j!*g} literal 0 HcmV?d00001 diff --git a/model/__pycache__/__init__.cpython-311.pyc b/model/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6601a0539f19c446ad0aba4917faa7aec199cc80 GIT binary patch literal 141 zcmZ3^%ge<81bI0R(?RrO5CH>>P{wCAAY(d13PUi1CZpd!&72-0 literal 0 HcmV?d00001 diff --git a/model/__pycache__/__init__.cpython-312.pyc b/model/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc703811ff93a39f495d2375ca3cf07983363f6a GIT binary patch literal 123 zcmX@j%ge<81bI0R(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!l5(+%2~g`kg1nrE=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DC#VRIHAt}Ek lCO1DNH76!MJ~J<~BtBlRpz;=n4N$B!C)Ez5=Q9v9000@27V-c9 literal 0 HcmV?d00001