diff options
Diffstat (limited to 'ATRI/plugins')
| -rw-r--r-- | ATRI/plugins/bot.py | 159 | ||||
| -rw-r--r-- | ATRI/plugins/character.py | 219 | ||||
| -rw-r--r-- | ATRI/plugins/curse.py | 55 | ||||
| -rw-r--r-- | ATRI/plugins/genshin/__init__.py | 53 | ||||
| -rw-r--r-- | ATRI/plugins/genshin/data_source.py | 121 | ||||
| -rw-r--r-- | ATRI/plugins/hitokoto.py | 76 | ||||
| -rw-r--r-- | ATRI/plugins/setu/__init__.py | 29 | ||||
| -rw-r--r-- | ATRI/plugins/setu/data_source.py | 14 | ||||
| -rw-r--r-- | ATRI/plugins/utils/__init__.py | 76 | ||||
| -rw-r--r-- | ATRI/plugins/utils/data_source.py | 239 | ||||
| -rw-r--r-- | ATRI/plugins/utils/main.bin | bin | 0 -> 3992353 bytes | 
11 files changed, 708 insertions, 333 deletions
diff --git a/ATRI/plugins/bot.py b/ATRI/plugins/bot.py deleted file mode 100644 index 42e05d0..0000000 --- a/ATRI/plugins/bot.py +++ /dev/null @@ -1,159 +0,0 @@ -from random import choice -from typing import Optional - -from nonebot.typing import Bot, Event -from nonebot.plugin import on_command, on_regex - -from ATRI.rule import isInBanList, isInDormant, toBot -from ATRI.utils import countList, delListAim, nowTime -from ATRI.config import BOT_CONFIG, NONEBOT_CONFIG - -# ===========================[Begin Command Processing]=========================== - - -class Action: -    callRobot = on_regex('|'.join(BOT_CONFIG['callRobot']['command']), -                         rule=isInBanList() & isInDormant(), -                         priority=4) - -    callMe = on_command(list(NONEBOT_CONFIG['nickname'])[0], -                        aliases=NONEBOT_CONFIG['nickname'], -                        rule=isInBanList() & isInDormant()) - -    teeTee = on_command(BOT_CONFIG['teetee']['command'][0], -                        aliases=set(BOT_CONFIG['teetee']['command']), -                        rule=isInBanList() & isInDormant() & toBot()) - -    kani = on_regex('|'.join(BOT_CONFIG['kani']['command']), -                    rule=isInBanList() & isInDormant()) - -    waste = on_regex('|'.join(BOT_CONFIG['waste']['command']), -                     rule=isInBanList() & isInDormant() & toBot(), -                     priority=5) - -    morning = on_command(BOT_CONFIG['morning']['command'][0], -                         aliases=set(BOT_CONFIG['morning']['command']), -                         rule=isInBanList() & isInDormant() & toBot()) - -    noon = on_command(BOT_CONFIG['noon']['command'][0], -                      aliases=set(BOT_CONFIG['noon']['command']), -                      rule=isInBanList() & isInDormant() & toBot()) - -    night = on_command(BOT_CONFIG['night']['command'][0], -                       aliases=set(BOT_CONFIG['night']['command']), -                       rule=isInBanList() & isInDormant() & toBot()) - -    cantdo = on_regex('|'.join(BOT_CONFIG['cantdo']['command']), -                      rule=isInBanList() & isInDormant()) - -    @callRobot.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._callRobot(event.user_id)) - -    @callMe.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._callMe()) - -    @teeTee.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._teeTee(event.user_id)) - -    @kani.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._kani()) - -    @waste.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._waste()) - -    @morning.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._morning()) - -    @noon.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._noon()) - -    @night.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._night()) -     -    @cantdo.handle() -    async def _(bot: Bot, event: Event, state: dict) -> None: -        await bot.send(event, ATRI()._cantdo()) - - -# ===========================[End Command Processing]=========================== - -callrobot_list = [] - - -class ATRI(): -    def _callRobot(self, user: Optional[int]) -> str: -        global callrobot_list -        result = '' -        for i in range(0, 5): -            if countList(callrobot_list, user) == i: -                result = choice(BOT_CONFIG['callRobot']['repo'][i]) -                callrobot_list.append(user) -                if countList(callrobot_list, user) == 5: -                    callrobot_list = delListAim(callrobot_list, user) -                break -            else: -                continue -        return result - -    def _callMe(self) -> str: -        return choice(BOT_CONFIG['atri']['repo']) - -    def _teeTee(self, user: Optional[int]) -> str: -        if user in NONEBOT_CONFIG['superusers']: -            return choice(BOT_CONFIG['teetee']['repo']['superusers']) -        else: -            return choice(BOT_CONFIG['teetee']['repo']['user']) - -    def _kani(self) -> str: -        return choice(BOT_CONFIG['kani']['repo']) - -    def _waste(self) -> str: -        return choice(BOT_CONFIG['waste']['repo']) - -    def _morning(self) -> str: -        period = BOT_CONFIG['morning']['repo'] -        if period[0]['period'][0] <= nowTime() < period[0]['period'][1]: -            return choice(period[0]['repo']) -        elif period[1]['period'][0] <= nowTime() < period[1]['period'][1]: -            return choice(period[1]['repo']) -        elif period[2]['period'][0] <= nowTime() < period[2]['period'][1]: -            return choice(period[2]['repo']) -        elif period[3]['period'][0] <= nowTime() < period[3]['period'][1]: -            return choice(period[3]['repo']) -        elif period[4]['period'][0] <= nowTime() < period[4]['period'][1]: -            return choice(period[4]['repo']) -        else: -            return choice(period['error']) - -    def _noon(self) -> str: -        if BOT_CONFIG['noon']['period'][0] <= nowTime( -        ) < BOT_CONFIG['noon']['period'][1]: -            return choice(BOT_CONFIG['noon']['repo']) -        else: -            return choice(BOT_CONFIG['noon']['error']) - -    def _night(self) -> str: -        period = BOT_CONFIG['night']['repo'] -        if period[0]['period'][0] <= nowTime() < period[0]['period'][1]: -            return choice(period[0]['repo']) -        elif period[1]['period'][0] <= nowTime() < period[1]['period'][1]: -            return choice(period[1]['repo']) -        elif period[2]['period'][0] <= nowTime() < period[2]['period'][1]: -            return choice(period[2]['repo']) -        elif period[3]['period'][0] <= nowTime() < period[3]['period'][1]: -            return choice(period[3]['repo']) -        elif period[4]['period'][0] <= nowTime() < period[4]['period'][1]: -            return choice(period[4]['repo']) -        else: -            return choice(period['error']) - -    def _cantdo(self) -> str: -        return choice(BOT_CONFIG['cantdo']['repo'])
\ No newline at end of file diff --git a/ATRI/plugins/character.py b/ATRI/plugins/character.py new file mode 100644 index 0000000..93dbc02 --- /dev/null +++ b/ATRI/plugins/character.py @@ -0,0 +1,219 @@ +from random import choice +from typing import Optional + +from nonebot.plugin import on_command, on_regex +from nonebot.adapters.cqhttp import Bot, Event + +from ATRI.rule import is_in_ban_list, is_in_dormant, to_bot +from ATRI.utils import count_list, del_list_aim, now_time +from ATRI.config import BOT_CONFIG, RUNTIME_CONFIG +from ATRI.service.plugin import Plugin + +# ===========================[Begin Command Processing]=========================== + +__plugin_name__ = 'call_robot' +__doc__ = """使用正则触发""" +Plugin.register(__plugin_name__, "func", __doc__, +                        command=BOT_CONFIG['callRobot']['command']) + +call_robot = on_regex('|'.join(BOT_CONFIG['callRobot']['command']), +                        rule=is_in_ban_list() & is_in_dormant(), +                        priority=4) + +@call_robot.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().call_robot(int(event.get_user_id()))) + + +__plugin_name__ = 'call_me' +__doc__ = """正确地呼叫咱""" +Plugin.register(__plugin_name__, "func", __doc__, +                        RUNTIME_CONFIG['nickname']) + +call_me = on_command(list(RUNTIME_CONFIG['nickname'])[0], +                    aliases=RUNTIME_CONFIG['nickname'], +                    rule=is_in_ban_list() & is_in_dormant()) + +@call_me.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().call_me()) + + +__plugin_name__ = 'tee_tee' +__doc__ = """一般人员不许贴! +需at""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['teetee']['command']) + +teeTee = on_command(BOT_CONFIG['teetee']['command'][0], +                    aliases=set(BOT_CONFIG['teetee']['command']), +                    rule=is_in_ban_list() & is_in_dormant() & to_bot()) + +@teeTee.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().tee_tee(int(event.get_user_id()))) + + + +__plugin_name__ = 'kani' +__doc__ = """カニ!カニ!!! +使用正则匹配""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['kani']['command']) + +kani = on_regex('|'.join(BOT_CONFIG['kani']['command']), +                rule=is_in_ban_list() & is_in_dormant()) + +@kani.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().kani()) + + +__plugin_name__ = 'waste' +__doc__ = """不准骂咱废物 +使用正则匹配,需at""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['waste']['command']) + +waste = on_regex('|'.join(BOT_CONFIG['waste']['command']), +                    rule=is_in_ban_list() & is_in_dormant() & to_bot(), +                    priority=5) + +@waste.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().waste()) + + +__plugin_name__ = 'good_morning' +__doc__ = """略带涩气的早安 +需at""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['morning']['command']) + +morning = on_command(BOT_CONFIG['morning']['command'][0], +                        aliases=set(BOT_CONFIG['morning']['command']), +                        rule=is_in_ban_list() & is_in_dormant() & to_bot()) + +@morning.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().morning()) + + +__plugin_name__ = 'good_noon' +__doc__ = """做白日梦 +需at""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['noon']['command']) + +noon = on_command(BOT_CONFIG['noon']['command'][0], +                    aliases=set(BOT_CONFIG['noon']['command']), +                    rule=is_in_ban_list() & is_in_dormant() & to_bot()) + +@noon.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().noon()) + + +__plugin_name__ = 'good_night' +__doc__ = """晚安~! +需at""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['night']['command']) + +night = on_command(BOT_CONFIG['night']['command'][0], +                    aliases=set(BOT_CONFIG['night']['command']), +                    rule=is_in_ban_list() & is_in_dormant() & to_bot()) + +@night.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().night()) + + +__plugin_name__ = 'cant_do_anything' +__doc__ = """吃饭第一名!好吃就是高兴!! +使用正则匹配""" +Plugin.register(__plugin_name__, "func", __doc__, +                        BOT_CONFIG['cantdo']['command']) + +cantdo = on_regex('|'.join(BOT_CONFIG['cantdo']['command']), +                    rule=is_in_ban_list() & is_in_dormant()) + +@cantdo.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, ATRI().cantdo()) + + +# ===========================[End Command Processing]============================= + +callrobot_list = [] + + +class ATRI: +    def call_robot(self, user: Optional[int]) -> str: +        global callrobot_list +        result = '' +        for i in range(0, 5): +            if count_list(callrobot_list, user) == i: +                result = choice(BOT_CONFIG['callRobot']['repo'][i]) +                callrobot_list.append(user) +                if count_list(callrobot_list, user) == 5: +                    callrobot_list = del_list_aim(callrobot_list, user) +                break +            else: +                continue +        return result + +    def call_me(self) -> str: +        return choice(BOT_CONFIG['atri']['repo']) + +    def tee_tee(self, user: Optional[int]) -> str: +        if user in RUNTIME_CONFIG['superusers']: +            return choice(BOT_CONFIG['teetee']['repo']['superusers']) +        else: +            return choice(BOT_CONFIG['teetee']['repo']['user']) + +    def kani(self) -> str: +        return choice(BOT_CONFIG['kani']['repo']) + +    def waste(self) -> str: +        return choice(BOT_CONFIG['waste']['repo']) + +    def morning(self) -> str: +        period = BOT_CONFIG['morning']['repo'] +        if period[0]['period'][0] <= now_time() < period[0]['period'][1]: +            return choice(period[0]['repo']) +        elif period[1]['period'][0] <= now_time() < period[1]['period'][1]: +            return choice(period[1]['repo']) +        elif period[2]['period'][0] <= now_time() < period[2]['period'][1]: +            return choice(period[2]['repo']) +        elif period[3]['period'][0] <= now_time() < period[3]['period'][1]: +            return choice(period[3]['repo']) +        elif period[4]['period'][0] <= now_time() < period[4]['period'][1]: +            return choice(period[4]['repo']) +        else: +            return choice(period['error']) + +    def noon(self) -> str: +        if BOT_CONFIG['noon']['period'][0] <= now_time( +        ) < BOT_CONFIG['noon']['period'][1]: +            return choice(BOT_CONFIG['noon']['repo']) +        else: +            return choice(BOT_CONFIG['noon']['error']) + +    def night(self) -> str: +        period = BOT_CONFIG['night']['repo'] +        if period[0]['period'][0] <= now_time() < period[0]['period'][1]: +            return choice(period[0]['repo']) +        elif period[1]['period'][0] <= now_time() < period[1]['period'][1]: +            return choice(period[1]['repo']) +        elif period[2]['period'][0] <= now_time() < period[2]['period'][1]: +            return choice(period[2]['repo']) +        elif period[3]['period'][0] <= now_time() < period[3]['period'][1]: +            return choice(period[3]['repo']) +        elif period[4]['period'][0] <= now_time() < period[4]['period'][1]: +            return choice(period[4]['repo']) +        else: +            return choice(period['error']) + +    def cantdo(self) -> str: +        return choice(BOT_CONFIG['cantdo']['repo']) diff --git a/ATRI/plugins/curse.py b/ATRI/plugins/curse.py index e69de29..2fa4986 100644 --- a/ATRI/plugins/curse.py +++ b/ATRI/plugins/curse.py @@ -0,0 +1,55 @@ +from random import choice +from nonebot.plugin import on_command +from nonebot.adapters.cqhttp import Bot + +from ATRI.request import Request +from ATRI.utils import count_list, del_list_aim +from ATRI.config import CURSE_CONFIG +from ATRI.exceptions import InvalidRequest +from ATRI.service.plugin import Plugin +from ATRI.rule import is_in_ban_list, is_in_service, is_in_dormant, to_bot + + + +# ===========================[Begin Command Processing]=========================== + + +__plugin_name__ = 'curse' +__doc__ = """口臭一下""" +Plugin.register(__plugin_name__, "func", __doc__, +                        CURSE_CONFIG['curse']['command']) + +curse = on_command(CURSE_CONFIG['curse']['command'][0], +                    aliases=set(CURSE_CONFIG['curse']['command']), +                    rule=is_in_ban_list() & is_in_dormant() +                    & is_in_service(__plugin_name__) +                    & to_bot()) + +@curse.handle() +async def _(bot: Bot, event) -> None: +    await bot.send( +        event, await Function().curse(str(event.get_user_id()))) + + +# ===========================[End Command Processing]============================= + +curse_list = [] + + +class Function: +    async def curse(self, user: str): +        global curse_list +         +        if count_list(curse_list, user) == 3: +            curse_list.append(user) +            return choice(CURSE_CONFIG['curse']['times'][3]['repo']) +        elif count_list(curse_list, user) == 6: +            curse_list = del_list_aim(curse_list, user) +            return choice(CURSE_CONFIG['curse']['times'][6]['repo']) +        else: +            try: +                curse_list.append(user) +                return str(await Request.get_text( +                    url=CURSE_CONFIG['curse']['url'])) +            except InvalidRequest: +                raise InvalidRequest('请求失败') diff --git a/ATRI/plugins/genshin/__init__.py b/ATRI/plugins/genshin/__init__.py deleted file mode 100644 index 4705e0e..0000000 --- a/ATRI/plugins/genshin/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -import re -from nonebot.plugin import on_command -from nonebot.typing import Bot, Event - -from ATRI.config import GENSHIN_CONFIG -from ATRI.exceptions import InvalidRequestError -from ATRI.rule import isInBanList, isInDormant, isInService - -from .data_source import Genshin - -__plugin_name__ = 'genshin' - -genshin = on_command(GENSHIN_CONFIG['genshin']['command'][0], -                     aliases=set(GENSHIN_CONFIG['genshin']['command']), -                     rule=isInBanList() & isInDormant() -                     & isInService(__plugin_name__)) - - -@genshin.handle() -async def _(bot: Bot, event: Event, state: dict) -> None: -    args = str(event.message) -     -    if args: -        state['args'] = args - -@genshin.got('args', prompt='请告诉咱id以及是官服还是b服嗷~w\n用空格隔开!!') -async def _(bot: Bot, event: Event, state: dict) -> None: -    args = state['args'].split(' ') -    uid_info = '' -    server_id = '' -     -    if len(args[0]) != 9: -        await genshin.finish('抱歉暂时只支持国服呢...') -    else: -        pass -     -    if re.findall('[Bb官]服', args[1]): -        if re.findall('[Bb]服', args[1]): -            server_id = 'cn_qd01' -        else: -            server_id = 'cn_gf01' -         -        await bot.send(event, '别急,在找!') -        try: -            uid_info = Genshin().jsonAnalysis(Genshin().getInfo(server_id=server_id, uid=args[0])) -        except InvalidRequestError: -            await genshin.finish('找不到呢...咱搜索区域或许出错了...') -         -        msg0 = (f'{args[0]} Genshin INFO:\n' -                f'{uid_info}') -        await genshin.finish(msg0) -    else: -        await genshin.finish('抱歉暂时只支持官服和b服...呐.') diff --git a/ATRI/plugins/genshin/data_source.py b/ATRI/plugins/genshin/data_source.py deleted file mode 100644 index 2bb4572..0000000 --- a/ATRI/plugins/genshin/data_source.py +++ /dev/null @@ -1,121 +0,0 @@ -import time -import json -import random -import string -import hashlib -import requests -from typing import Optional - -from ATRI.request import Request -from ATRI.config import GENSHIN_CONFIG -from ATRI.exceptions import InvalidRequestError - - -mhyVersion = GENSHIN_CONFIG['genshin']['mhyVersion'] - - -class Genshin: -    def md5(self, text: str) -> str: -        md5 = hashlib.md5() -        md5.update(text.encode()) -        return md5.hexdigest() - -    def getDS(self): -        global mhyVersion -        if mhyVersion == '2.1.0': -            n = self.md5(mhyVersion) -        elif mhyVersion == '2.2.1': -            n = "cx2y9z9a29tfqvr1qsq6c7yz99b5jsqt" -        else: -            mhyVersion = "2.2.1" -            n = "cx2y9z9a29tfqvr1qsq6c7yz99b5jsqt" -         -        i = str(int(time.time())) -        r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) -        c = self.md5("salt=" + n + "&t="+ i + "&r=" + r) -        return (i + "," + r + "," + c) -     -    def getInfo(self, server_id: str, uid: str) -> str: -        try: -            url = GENSHIN_CONFIG['genshin']['url'] + server_id + "&role_id=" + uid -            print(url) -            headers: dict = { -                'Accept': 'application/json, text/plain, */*', -                'DS': self.getDS(), -                'Origin': 'https://webstatic.mihoyo.com', -                'x-rpc-app_version': mhyVersion, -                'User-Agent': 'Mozilla/5.0 (Linux; Android 9; Unspecified Device) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 miHoYoBBS/2.2.0', -                'x-rpc-client_type': '4', -                'Referer': 'https://webstatic.mihoyo.com/app/community-game-records/index.html?v=6', -                'Accept-Encoding': 'gzip, deflate', -                'Accept-Language': 'zh-CN,en-US;q=0.8', -                'X-Requested-With': 'com.mihoyo.hyperion' -            } -            result = requests.get(url=url,headers=headers, timeout=10) -            print(result.text) -            return result.text -        except InvalidRequestError: -            raise InvalidRequestError('请求数据出错') -     -    def jsonAnalysis(self, a) -> Optional[str]: -        print(a) -        data = json.loads(a) -        if data['retcode'] != 0: -            raise InvalidRequestError('请求出错,原因:uid错误/不存在/国服之外') -        else: -            pass -         -        character_info = 'Roles:\n' -        character_list = data['data']['avatars'] -        for i in character_list: -            if i["element"] == "None": -                character_type = "无属性" -            elif i["element"] == "Anemo": -                character_type = "风属性" -            elif i["element"] == "Pyro": -                character_type = "火属性" -            elif i["element"] == "Geo": -                character_type = "岩属性" -            elif i["element"] == "Electro": -                character_type = "雷属性" -            elif i["element"] == "Cryo": -                character_type = "冰属性" -            elif i["element"] == "Hydro": -                character_type = "水属性" -            else: -                character_type = "草属性" -             -            if i["name"] == "旅行者": -                if i["image"].find("UI_AvatarIcon_PlayerGirl") != -1: -                    temp_text = f'* {i["name"]}:\n' -                    temp_text += f'  - [萤——妹妹] {i["level"]}级 {character_type}\n' - -                elif i["image"].find("UI_AvatarIcon_PlayerBoy") != -1: -                    temp_text = f'* {i["name"]}:\n' -                    temp_text += f'  - [空——哥哥] {i["level"]}级 {character_type}\n' - -                else: -                    temp_text = f'* {i["name"]}:\n' -                    temp_text += f'  - [性别判断失败] {i["level"]}级 {character_type}\n' -            else: -                temp_text = f'* {i["name"]} {i["rarity"]}★角色:\n' -                temp_text += f'  - {i["level"]}级 好感度({i["fetter"]})级 {character_type}\n' -             -            character_info += temp_text -             -            a1 = data["data"]["stats"]["spiral_abyss"] - -            account_info = 'Account Info:\n' -            account_info += f'- 活跃天数:{data["data"]["stats"]["active_day_number"]} 天\n' -            account_info += f'- 达成成就:{data["data"]["stats"]["achievement_number"]} 个\n' -            account_info += f'- 获得角色:{data["data"]["stats"]["avatar_number"]}个\n' -            account_info += f'- 深渊螺旋:{"没打" if (data["data"]["stats"]["spiral_abyss"] == "-") else f"打到了{a1}"}\n' -            account_info += f'* 收集:\n' -            account_info += f'  - 风神瞳{data["data"]["stats"]["anemoculus_number"]}个 岩神瞳{data["data"]["stats"]["geoculus_number"]}个\n' -            account_info += f'* 解锁:\n' -            account_info += f'  - 传送点{data["data"]["stats"]["way_point_number"]}个 秘境{data["data"]["stats"]["domain_number"]}个\n' -            account_info += f'* 共开启宝箱:\n' -            account_info += f'  - 普通:{data["data"]["stats"]["common_chest_number"]}个 精致:{data["data"]["stats"]["exquisite_chest_number"]}个\n' -            account_info += f'  - 珍贵:{data["data"]["stats"]["luxurious_chest_number"]}个 华丽:{data["data"]["stats"]["precious_chest_number"]}个' -             -            return str(character_info + '\r\n' + account_info) diff --git a/ATRI/plugins/hitokoto.py b/ATRI/plugins/hitokoto.py index e69de29..cf03b6f 100644 --- a/ATRI/plugins/hitokoto.py +++ b/ATRI/plugins/hitokoto.py @@ -0,0 +1,76 @@ +import json +from pathlib import Path +from random import choice, randint + +from nonebot.plugin import on_command +from nonebot.adapters.cqhttp import Bot, Event + +from ATRI.exceptions import InvalidLoad +from ATRI.rule import is_in_ban_list, is_in_dormant, is_in_service, to_bot +from ATRI.utils import del_list_aim, count_list +from ATRI.request import Request +from ATRI.config import HITOKOTO_CONFIG +from ATRI.service.plugin import Plugin + +# ===========================[Begin Command Processing]=========================== + + +__plugin_name__ = 'hitokoto' +__doc__ = """一言""" +Plugin.register(__plugin_name__, "func", __doc__, +         HITOKOTO_CONFIG['hitokoto']['command']) + +hitokoto = on_command(HITOKOTO_CONFIG['hitokoto']['command'][0], +                        aliases=set(HITOKOTO_CONFIG['hitokoto']['command']), +                        rule=is_in_ban_list() & is_in_dormant() +                        & is_in_service(__plugin_name__) +                        & to_bot()) + +@hitokoto.handle() +async def _(bot: Bot, event: Event) -> None: +    await bot.send(event, await Function().hitokoto(str(event.get_user_id()))) + + +# ===========================[End Command Processing]============================= + +hitokoto_list = [] +local_path = Path('.') / 'ATRI' / 'data' / 'database' / 'hitokoto' + +class Function: +    async def hitokoto(self, user: str): +        def local() -> str: +            rd = choice(HITOKOTO_CONFIG['hitokoto']['local']['file']) +            path = local_path / f"{rd}" +            data = {} +            try: +                data = json.loads(path.read_bytes()) +            except InvalidLoad: +                raise InvalidLoad('Failed to read file!') +            return data[randint(1, len(data)) - 1]['hitokoto'] +         +        async def link() -> str: +            url = HITOKOTO_CONFIG['hitokoto']['link']['url'] +            return str( +                await Request.get_text( +                    url=url +                ) +            ) +         +        global hitokoto_list + +        if count_list(hitokoto_list, user) == 3: +            hitokoto_list.append(user) +            return choice(HITOKOTO_CONFIG['hitokoto']['times'][3]['repo']) +        elif count_list(hitokoto_list, user) == 6: +            hitokoto_list = del_list_aim(hitokoto_list, user) +            return choice(HITOKOTO_CONFIG['hitokoto']['times'][6]['repo']) +        else: +            hitokoto_list.append(user) +            if HITOKOTO_CONFIG['hitokoto']['link']['use']: +                rd = randint(1,2) +                if rd == 1: +                    return await link() +                else: +                    return local() +            else: +                return local() diff --git a/ATRI/plugins/setu/__init__.py b/ATRI/plugins/setu/__init__.py new file mode 100644 index 0000000..68cb1d2 --- /dev/null +++ b/ATRI/plugins/setu/__init__.py @@ -0,0 +1,29 @@ +from nonebot.plugin import on_regex +from nonebot.adapters.cqhttp import Bot +from nonebot.adapters.cqhttp.event import MessageEvent + +from ATRI.service.plugin import Plugin +from ATRI.config import SETU_CONFIG +from ATRI.rule import is_in_service, is_in_ban_list, is_in_dormant + +# ===========================[Begin Command Processing]=========================== + + +__plugin_name__ = 'setu' +__doc__ = """ +涩图,开冲! +使用正则匹配 +""" +Plugin.register(plugin_name=__plugin_name__, _type="func", doc=__doc__, command=SETU_CONFIG['setu']['command']) + +setu = on_regex('|'.join(SETU_CONFIG['setu']['command']), +                rule=is_in_service(__plugin_name__) & is_in_ban_list() +                & is_in_dormant()) + +@setu.handle() +async def _(bot: Bot, event: MessageEvent) -> None: +    await bot.send(event, SETU_CONFIG['setu']['repo']['waiting']) +     +     + +# ===========================[End Command Processing]=============================
\ No newline at end of file diff --git a/ATRI/plugins/setu/data_source.py b/ATRI/plugins/setu/data_source.py new file mode 100644 index 0000000..c5fffce --- /dev/null +++ b/ATRI/plugins/setu/data_source.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from ATRI.config import SETU_CONFIG + +DATA_PATH = Path('.') / 'ATRI' / 'data' / 'database' + +class Function: +    @staticmethod +    async def setu_port() -> str: +        ... +     +    @staticmethod +    async def setu_local() -> str: +        ... diff --git a/ATRI/plugins/utils/__init__.py b/ATRI/plugins/utils/__init__.py new file mode 100644 index 0000000..4204cfb --- /dev/null +++ b/ATRI/plugins/utils/__init__.py @@ -0,0 +1,76 @@ +import re +from nonebot.matcher import Matcher +from nonebot.plugin import on_command +from nonebot.adapters.cqhttp import Bot, Event + +from ATRI.config import UTILS_CONFIG +from ATRI.rule import is_in_ban_list, is_in_dormant, is_in_service + +from .data_source import Function + +# ===========================[Begin Command Processing]=========================== + + +__plugin_name_0__ = 'roll' +roll = on_command(UTILS_CONFIG['utils']['roll']['command'][0], +                    aliases=set(UTILS_CONFIG['utils']['roll']['command']), +                    rule=is_in_ban_list() & is_in_dormant() +                    & is_in_service(__plugin_name_0__)) + +__plugin_name_1__ = 'rcnb' +rcnbEncode = on_command( +                    UTILS_CONFIG['utils']['rcnb']['encode']['command'][0], +                    aliases=set( +                        UTILS_CONFIG['utils']['rcnb']['encode']['command']), +                    rule=is_in_ban_list() & is_in_dormant() +                    & is_in_service(__plugin_name_1__)) + +rcnbDecode = on_command( +                    UTILS_CONFIG['utils']['rcnb']['decode']['command'][0], +                    aliases=set( +                        UTILS_CONFIG['utils']['rcnb']['decode']['command']), +                    rule=is_in_ban_list() & is_in_dormant() +                    & is_in_service(__plugin_name_1__)) + + +@roll.handle() +async def _(bot, event: Event, state: dict) -> None: +    args = str(event.get_message()).strip() +    print(args) +    if args: +        state['result'] = args + +@roll.got('result', prompt='roll参数不能为空!..\ndemo: 1d10 或 2d10+3d10') +async def _(matcher: Matcher, bot: Bot, event: Event, state: dict) -> None: +    resu = state['result'] +    match = re.match(r'^([\dd+\s]+?)$', resu) +    print(match) +    if not match: +        await matcher.reject('格式不-正-确!\ndemo: 1d10 或 2d10+3d10') +    await bot.send(event, Function.roll_dice(par=resu)) + + +@rcnbEncode.handle() +async def _(bot, event: Event, state: dict) -> None: +    args = str(event.get_message()).strip() +    if args: +        state['result'] = args + +@rcnbEncode.got('result', prompt='请告诉咱需要加密的字符~!') +async def _(bot: Bot, event: Event, state: dict) -> None: +    print(state['result']) +    await bot.send(event, Function.RCNB.encode(state['result'])) + + +@rcnbDecode.handle() +async def _(bot, event: Event, state: dict) -> None: +    args = str(event.get_message()).strip() +    if args: +        state['result'] = args + +@rcnbEncode.got('result', prompt='请告诉咱需要解密的字符~!') +async def _(bot: Bot, event: Event, state: dict) -> None: +    await bot.send(event, Function.RCNB.decode(state['result'])) +         + +# ===========================[End Command Processing]============================= diff --git a/ATRI/plugins/utils/data_source.py b/ATRI/plugins/utils/data_source.py new file mode 100644 index 0000000..4d7ddb6 --- /dev/null +++ b/ATRI/plugins/utils/data_source.py @@ -0,0 +1,239 @@ +import re +import os +import json +import random +from math import floor +from pathlib import Path +from zipfile import PyZipFile +from typing import Tuple, Union +from random import choice, randint +from typing import Dict, List + +from ATRI.config import UTILS_CONFIG + + +class Function: +    @staticmethod +    def roll_dice(par: str) -> str: +        result = 0 +        proc = '' +        proc_list = [] +        p = par.split('+') +         +        for i in p: +            args = re.findall(r"(\d{0,10})(?:(d)(\d{1,10}))", i) +            args = list(args[0]) +            if not args[0]: +                args[0] = 1 +            if int(args[0]) >= 5000 or int(args[2]) >= 5000: +                return choice(UTILS_CONFIG['utils']['roll']['tooBig']['repo']) +            for a in range(1, int(args[0]) + 1): +                rd = randint(1, int(args[2])) +                result = result + rd +                if len(proc_list) <= 10: +                    proc_list.append(rd) + +        if len(proc_list) <= 10: +            proc += '+'.join(map(str, proc_list)) +        elif len(proc_list) >= 10: +            proc += choice(UTILS_CONFIG['utils']['roll']['tooLong']['repo']) +        else: +            proc += str(result) + +        msg = f'{par}=({proc})={result}' +        print(msg) +        return msg +     +    class Generate: +        ''' +        (*彩蛋*) +        由于此功能触及法律故不用作上线功能,写于此地只为学习 +        请勿用作网上购物、交易和注册 +        随机身份证根据国家标准(GB11643-1999)生成 +        并不存在所谓: +            - 生成在逃犯号码 +        ''' +        @classmethod +        def __init__(cls) -> None: +            cls.DATA_PATH = Path('.') / 'ATRI' / 'plugins' / 'utils' / 'main.bin' +         +        @classmethod +        def info_id(cls) -> Tuple[Dict[str, List[str]], Dict[str, str]]: +            with PyZipFile(os.path.abspath(cls.DATA_PATH), 'r') as zipFile: +                with zipFile.open('name.json', 'r') as f: +                    name = json.loads(f.read().decode()) +                with zipFile.open('area.json', 'r') as f: +                    area = json.loads(f.read().decode()) +            return name, area +         +        @staticmethod +        def number_id(area: int, gender: int, birth: int) -> str: +            ''' +            校验码计算公式: (12-∑(Ai×Wi)(mod 11))mod 11 +            验证公式: 请查阅(ISO 7064:1983.MOD 11-2) +            ''' +            def check_sum(full_code: str): +                assert len(full_code) == 17 +                check_sum = sum([((1 << (17 - i)) % 11) * int(full_code[i]) +                                 for i in range(0, 17)]) +                check_digit = (12 - (check_sum % 11)) % 11 +                if check_digit < 10: +                    return check_digit +                else: +                    return 'X' + +            order_code = str(random.randint(10, 99)) +            gender_code = str(random.randrange(gender, 10, step=2)) +            full_code = str(area) + str(birth) + str(order_code) + str(gender_code) +            full_code += str(check_sum(full_code)) +            return full_code + +    class RCNB: +        @classmethod +        def __init__(cls) -> None: +            cls.cr = 'rRŔŕŖŗŘřƦȐȑȒȓɌɍ' +            cls.cc = 'cCĆćĈĉĊċČčƇƈÇȻȼ' +            cls.cn = 'nNŃńŅņŇňƝƞÑǸǹȠȵ' +            cls.cb = 'bBƀƁƃƄƅßÞþ' + +            cls.sr = len(cls.cr) +            cls.sc = len(cls.cc) +            cls.sn = len(cls.cn) +            cls.sb = len(cls.cb) +            cls.src = cls.sr * cls.sc +            cls.snb = cls.sn * cls.sb +            cls.scnb = cls.sc * cls.snb + +        @staticmethod +        def _div(a: int, b: int) -> int: +            return floor(a / b) + +        @classmethod +        def _encode_byte(cls, i) -> Union[str, None]: +            if i > 0xFF: +                raise ValueError('ERROR! rc/nb overflow') + +            if i > 0x7F: +                i = i & 0x7F +                return cls.cn[i // cls.sb] + cls.cb[i % cls.sb] +                # return f'{cls.cn[i // cls.sb]}{cls.cb[i % cls.sb]}' +                # return cls.cn[cls._div(i, cls.sb) + int(cls.cb[i % cls.sb])] + +            return cls.cr[i // cls.sc] + cls.cc[i % cls.sc] +            # return cls.cr[cls._div(i, cls.sc) + int(cls.cc[i % cls.sc])] + +        @classmethod +        def _encode_short(cls, i) -> str: +            if i > 0xFFFF: +                raise ValueError('ERROR! rcnb overflow') + +            reverse = False +            if i > 0x7FFF: +                reverse = True +                i = i & 0x7FFF + +            char = [ +                cls._div(i, cls.scnb), +                cls._div(i % cls.scnb, cls.snb), +                cls._div(i % cls.snb, cls.sb), i % cls.sb +            ] +            char = [ +                cls.cr[char[0]], cls.cc[char[1]], cls.cn[char[2]], +                cls.cb[char[3]] +            ] + +            if reverse: +                return char[2] + char[3] + char[0] + char[1] + +            return ''.join(char) + +        @classmethod +        def _decodeByte(cls, c) -> int: +            nb = False +            idx = [cls.cr.index(c[0]), cls.cc.index(c[1])] +            if idx[0] < 0 or idx[1] < 0: +                idx = [cls.cn.index(c[0]), cls.cb.index(c[1])] +                nb = True +                raise ValueError('ERROR! rc/nb overflow') + +            result = idx[0] * cls.sb + idx[1] if nb else idx[0] * cls.sc + idx[1] +            if result > 0x7F: +                raise ValueError('ERROR! rc/nb overflow') + +            return result | 0x80 if nb else 0 + +        @classmethod +        def _decodeShort(cls, c) -> int: +            reverse = c[0] not in cls.cr +            if not reverse: +                idx = [ +                    cls.cr.index(c[0]), +                    cls.cc.index(c[1]), +                    cls.cn.index(c[2]), +                    cls.cb.index(c[3]) +                ] +            else: +                idx = [ +                    cls.cr.index(c[2]), +                    cls.cc.index(c[3]), +                    cls.cn.index(c[0]), +                    cls.cb.index(c[1]) +                ] + +            if idx[0] < 0 or idx[1] < 0 or idx[2] < 0 or idx[3] < 0: +                raise ValueError('ERROR! not rcnb') + +            result = (idx[0] * cls.scnb + +                      idx[1] * cls.snb + +                      idx[2] * cls.sb + idx[3]) +            if result > 0x7FFF: +                raise ValueError('ERROR! rcnb overflow') + +            result |= 0x8000 if reverse else 0 +            return result + +        @classmethod +        def _encodeBytes(cls, b) -> str: +            result = [] +            for i in range(0, (len(b) >> 1)): +                result.append(cls._encode_short((b[i * 2] << 8 | b[i * 2 + 1]))) + +            if len(b) & 1 == 1: +                result.append(cls._encode_byte(b[-1])) + +            return ''.join(result) + +        @classmethod +        def encode(cls, s: str, encoding: str = 'utf-8'): +            if not isinstance(s, str): +                raise ValueError('Please enter str instead of other') + +            return cls._encodeBytes(s.encode(encoding)) + +        @classmethod +        def _decodeBytes(cls, s: str): +            if not isinstance(s, str): +                raise ValueError('Please enter str instead of other') +             +            if len(s) & 1: +                raise ValueError('ERROR length') + +            result = [] +            for i in range(0, (len(s) >> 2)): +                result.append(bytes([cls._decodeShort(s[i * 4:i * 4 + 4]) >> 8])) +                result.append(bytes([cls._decodeShort(s[i * 4:i * 4 + 4]) & 0xFF])) + +            if (len(s) & 2) == 2: +                result.append(bytes([cls._decodeByte(s[-2:])])) + +            return b''.join(result) + +        @classmethod +        def decode(cls, s: str, encoding: str = 'utf-8') -> str: +            if not isinstance(s, str): +                raise ValueError('Please enter str instead of other') + +            try: +                return cls._decodeBytes(s).decode(encoding) +            except UnicodeDecodeError: +                raise ValueError('Decoding failed') diff --git a/ATRI/plugins/utils/main.bin b/ATRI/plugins/utils/main.bin Binary files differnew file mode 100644 index 0000000..6e74a60 --- /dev/null +++ b/ATRI/plugins/utils/main.bin  | 
