From e96c42ef2006e052dc334c1cc1771e546f357fae Mon Sep 17 00:00:00 2001
From: Kyomotoi <1172294279@qq.com>
Date: Sun, 18 Oct 2020 15:22:16 +0800
Subject: [Update]

---
 ATRI/__init__.py                       |  11 +-
 ATRI/data/data_IDcard/main.bin         | Bin 0 -> 3992353 bytes
 ATRI/plugins/plugin_admin/__init__.py  |  20 +++-
 ATRI/plugins/plugin_anime/__init__.py  | 114 +++++++++++++++---
 ATRI/plugins/plugin_anime/body.py      |  11 +-
 ATRI/plugins/plugin_chat/__init__.py   |  92 ++++++++++++++-
 ATRI/plugins/plugin_pixiv/__init__.py  | 203 +++++++++++++++++++++++++++++++++
 ATRI/plugins/plugin_rich/__init__.py   |  12 +-
 ATRI/plugins/plugin_rich/body.py       |  11 +-
 ATRI/plugins/plugin_status/__init__.py |  11 +-
 ATRI/plugins/plugin_test/__init__.py   |  47 ++++++++
 ATRI/plugins/plugin_test/test.mp3      | Bin 0 -> 4029360 bytes
 ATRI/plugins/plugin_utils/__init__.py  |  88 ++++++++++++++
 BOT.py                                 |  11 +-
 README.md                              |  62 +---------
 utils/utils_banList/__init__.py        |  45 ++++++--
 utils/utils_error/__init__.py          |  15 ++-
 utils/utils_history/__init__.py        |  11 +-
 utils/utils_img/__init__.py            |  93 +++++++++++++++
 utils/utils_request/__init__.py        |  11 +-
 utils/utils_switch/__init__.py         |  17 ++-
 utils/utils_switch/switch.json         |   2 +-
 22 files changed, 778 insertions(+), 109 deletions(-)
 create mode 100644 ATRI/data/data_IDcard/main.bin
 create mode 100644 ATRI/plugins/plugin_pixiv/__init__.py
 create mode 100644 ATRI/plugins/plugin_test/__init__.py
 create mode 100644 ATRI/plugins/plugin_test/test.mp3
 create mode 100644 ATRI/plugins/plugin_utils/__init__.py
 create mode 100644 utils/utils_img/__init__.py

diff --git a/ATRI/__init__.py b/ATRI/__init__.py
index 4fe81ba..fd5b8f6 100644
--- a/ATRI/__init__.py
+++ b/ATRI/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:42:47
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import json
 from pathlib import Path
diff --git a/ATRI/data/data_IDcard/main.bin b/ATRI/data/data_IDcard/main.bin
new file mode 100644
index 0000000..6e74a60
Binary files /dev/null and b/ATRI/data/data_IDcard/main.bin differ
diff --git a/ATRI/plugins/plugin_admin/__init__.py b/ATRI/plugins/plugin_admin/__init__.py
index 3a7175c..3a3c259 100644
--- a/ATRI/plugins/plugin_admin/__init__.py
+++ b/ATRI/plugins/plugin_admin/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:37:53
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import re
 
@@ -36,14 +45,15 @@ async def _(bot: Bot, event: Event, state: dict) -> None:
             msg0 += "└Service:\n"
             msg0 += "    ├anime-setu\n"
             msg0 += "    ├anime-pic-search\n"
-            msg0 += "    └anime-vid-search\n"
+            msg0 += "    ├anime-vid-search\n"
+            msg0 += "    ├ai-face\n"
+            msg0 += "    ├pixiv-pic-search\n"
+            msg0 += "    ├pixiv-author-search\n"
+            msg0 += "    └pixiv-rank"
 
             await switch.finish(msg0)
         
         funct = re.findall(r"[on|off]-(.*)", func)
-        print(func, funct)
-
-        print(type(master[0]), type(user))
         
         if "all-on" in func:
             if int(user) in master:
diff --git a/ATRI/plugins/plugin_anime/__init__.py b/ATRI/plugins/plugin_anime/__init__.py
index 7abf59d..c15fc14 100644
--- a/ATRI/plugins/plugin_anime/__init__.py
+++ b/ATRI/plugins/plugin_anime/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:38:14
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import re
 import json
@@ -8,8 +17,9 @@ from pathlib import Path
 from random import randint
 
 from nonebot.log import logger
-from nonebot.adapters.cqhttp import Bot, Event
+from nonebot import scheduler
 from nonebot.permission import SUPERUSER
+from nonebot.adapters.cqhttp import Bot, Event
 from nonebot.plugin import on_message, on_command, on_regex
 
 from utils.utils_banList import banList
@@ -17,6 +27,7 @@ from utils.utils_error import errorRepo
 from utils.utils_history import getMessage
 from utils.utils_switch import checkSwitch
 from utils.utils_request import aio_get_bytes, request_get
+from utils.utils_img import compress_image, aio_download_pics
 
 from .body import resultRepo
 import ATRI
@@ -229,19 +240,13 @@ setu_type = 1  # setu-type: 1(local), 2(url: https://api.lolicon.app/#/setu) def
 setu = on_regex(r"来[点丶张份副个幅][涩色瑟][图圖]|[涩色瑟][图圖]来|[涩色瑟][图圖][gkd|GKD|搞快点]|[gkd|GKD|搞快点][涩色瑟][图圖]")
 
 @setu.handle() # type: ignore
-async def _(bot: Bot, event: Event, state: dict) -> None:
+async def _setu(bot: Bot, event: Event, state: dict) -> None:
     user = str(event.user_id)
     group = str(event.group_id)
 
     if banList(user, group):
         if checkSwitch(plugin_name_2, group):
 
-            await bot.send_msg(
-                user_id=int(user),
-                group_id=int(group),
-                message="别急!正在找图!"
-            )
-
             res = randint(1,5)
 
             if setu_type == 1:
@@ -258,8 +263,8 @@ async def _(bot: Bot, event: Event, state: dict) -> None:
                     msg0 = f"setu info:\n"
                     msg0 += f"Title: {title}\n"
                     msg0 += f"Pid: {pid}\n"
-                    msg0 += f"{img}"
-
+                    msg0 += f"[CQ:image,file=file:///{compress_image(await aio_download_pics(img))}]"
+                    
                     if 1 <= res < 5:
                         await setu.finish(msg0)
 
@@ -270,9 +275,9 @@ async def _(bot: Bot, event: Event, state: dict) -> None:
                             message="我找到涩图了!但我发给主人了\nο(=•ω<=)ρ⌒☆"
                         )
 
-                        await bot.send_msg(
+                        await bot.send_private_msg(
                             user_id=ATRI.config_SUPERUSERS,
-                            message=f"主人,从群{group}来的涩图!热乎着!\nTitle: {title}\nPid: {pid}\n{img}"
+                            message=f"主人,从群{group}来的涩图!热乎着!\nTitle: {title}\nPid: {pid}\n[CQ:image,file=file:///{compress_image(await aio_download_pics(img))}]"
                         )
             
             else:
@@ -282,18 +287,33 @@ async def _(bot: Bot, event: Event, state: dict) -> None:
                     "num": "1"
                 }
 
+                data = {}
+
                 try:
                     data = json.loads(request_get('https://api.lolicon.app/setu/', params))
                 except Exception:
                     await setu.finish(errorRepo("请求数据失败,也可能为接口调用次数达上限"))
                 
-                msg0 = f"setu info:"
-                msg0 += f'Title: {data["data"][0]["title"]}' # type: ignore
-                msg0 += f'Pid: {data["data"][0]["pid"]}' # type: ignore
-                msg0 += f'{data["data"][0]["url"]}' # type: ignore
+                msg0 = f"setu info:\n"
+                msg0 += f'Title: {data["data"][0]["title"]}\n'
+                msg0 += f'Pid: {data["data"][0]["pid"]}\n'
+                msg0 += f'[CQ:image,file=file:///{compress_image(await aio_download_pics(data["data"][0]["url"]))}]'
 
-                await setu.finish(msg0)
-        
+                if 1 <= res < 5:
+                    await setu.finish(msg0)
+                
+                elif res == 5:
+                    await bot.send_msg(
+                        user_id=int(user),
+                        group_id=int(group),
+                        message="我找到涩图了!但我发给主人了\nο(=•ω<=)ρ⌒☆"
+                    )
+
+                    await bot.send_private_msg(
+                        user_id=ATRI.config_SUPERUSERS,
+                        message=f'主人,从群{group}来的涩图!热乎着!\nTitle: {data["data"][0]["title"]}\nPid: {data["data"][0]["pid"]}\n[CQ:image,file=file:///{compress_image(await aio_download_pics(data["data"][0]["url"]))}]'
+                    )
+            
         else:
             await setu.finish(f"Service-{plugin_name_2} has been closed.")
 
@@ -326,3 +346,59 @@ async def _(bot: Bot, event: Event, state: dict) -> None:
         await setuType.finish("请检查类型是否输入正确嗷!")
     
     await setuType.finish("Type conversion completed!")
+
+
+# @scheduler.scheduled_job(
+#     "cron",
+#     minute=45,
+#     bot=Bot,
+#     event=Event,
+#     state=dict
+#     )
+# async def _(bot: Bot, event: Event, state: dict) -> None:
+#     group = str(event.group_id)
+
+#     if banList(group=group):
+#         if checkSwitch(plugin_name_2, group):
+#             # group_list = await bot.get_group_list()
+#             # group = sample(group_list, 1)
+#             # group = group['group_id']
+
+#             if setu_type == 1:
+
+#                 con = sqlite3.connect(Path('.') / 'ATRI' / 'data' / 'data_Sqlite' / 'setu' / 'nearR18.db')
+#                 cur = con.cursor()
+#                 msg = cur.execute('SELECT * FROM nearR18 ORDER BY RANDOM() limit 1;')
+
+#                 for i in msg:
+#                     pid = i[0]
+#                     title = i[1]
+#                     img = i[7]
+                    
+#                     msg0 = f"setu info:\n"
+#                     msg0 += f"Title: {title}\n"
+#                     msg0 += f"Pid: {pid}\n"
+#                     msg0 += f"[CQ:image,file=file:///{compress_image(await aio_download_pics(img))}]"
+                    
+#                     await setu.finish(msg0)
+            
+#             else:
+#                 params = {
+#                     "apikey": key_LoliconAPI,
+#                     "r18": "0",
+#                     "num": "1"
+#                 }
+
+#                 data = {}
+
+#                 try:
+#                     data = json.loads(request_get('https://api.lolicon.app/setu/', params))
+#                 except Exception:
+#                     await setu.finish(errorRepo("请求数据失败,也可能为接口调用次数达上限"))
+                
+#                 msg0 = f"setu info:\n"
+#                 msg0 += f'Title: {data["data"][0]["title"]}\n'
+#                 msg0 += f'Pid: {data["data"][0]["pid"]}\n'
+#                 msg0 += f'[CQ:image,file=file:///{compress_image(await aio_download_pics(data["data"][0]["url"]))}]'
+
+#                 await setu.finish(msg0)
diff --git a/ATRI/plugins/plugin_anime/body.py b/ATRI/plugins/plugin_anime/body.py
index 02c57bb..00ee4ec 100644
--- a/ATRI/plugins/plugin_anime/body.py
+++ b/ATRI/plugins/plugin_anime/body.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   body.py
+@Time    :   2020/10/11 14:38:23
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import json
 
diff --git a/ATRI/plugins/plugin_chat/__init__.py b/ATRI/plugins/plugin_chat/__init__.py
index 6fd7099..fc2a6e2 100644
--- a/ATRI/plugins/plugin_chat/__init__.py
+++ b/ATRI/plugins/plugin_chat/__init__.py
@@ -1,13 +1,27 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:38:38
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
+
+from random import choice
 
 from nonebot.log import logger
-from nonebot.plugin import on_message
+from nonebot.rule import to_me
 from nonebot.adapters.cqhttp import Bot, Event
+from nonebot.plugin import on_command, on_message, on_notice
 
+from utils.utils_banList import banList
 from utils.utils_history import saveMessage
 
 
+# 收集 bot 所在群的聊天记录
 MessageSave = on_message()
 
 @MessageSave.handle() # type: ignore
@@ -22,4 +36,76 @@ async def _(bot: Bot, event: Event, state: dict) -> None:
     else:
         saveMessage(message_id, message, user, group)
     
-    logger.opt(colors=True).info(f"[<yellow>{group}</yellow>]-U: (<blue>{user}</blue>) | Message: (<green>{message}</green>) Saved successfully")
\ No newline at end of file
+    logger.opt(colors=True).info(f"[<yellow>{group}</yellow>]-U: (<blue>{user}</blue>) | Message: (<green>{message}</green>) Saved successfully")
+
+
+# Call bot
+callMe = on_message()
+
+@callMe.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    user = str(event.user_id)
+    group = str(event.group_id)
+
+    if banList(user, group):
+        msg = str(event.message)
+
+        if "ATRI" == msg or "亚托莉" == msg or "アトリ" == msg:
+            await callMe.finish("叫我有啥事吗w")
+        
+        elif "萝卜子" in msg:
+            await bot.send(event, "萝卜子是对咱的蔑称!!")
+        
+        else:
+            pass
+
+
+
+# 戳 一 戳
+pokehah = on_command("戳一戳", rule=to_me())
+
+@pokehah.handle() # type: ignore
+async def _poke(bot: Bot, event: Event, state: dict) -> None:
+    user = str(event.user_id)
+    group = str(event.group_id)
+
+    if banList(user, group):
+        msg = choice(
+                    [
+                        "你再戳!",
+                        "?再戳试试?",
+                        "别戳了别戳了再戳就坏了555",
+                        "我爪巴爪巴,球球别再戳了",
+                        "你戳你🐎呢?!",
+                        "那...那里...那里不能戳...绝对...",
+                        "(。´・ω・)ん?",
+                        "有事恁叫我,别天天一个劲戳戳戳!",
+                        "欸很烦欸!你戳🔨呢",
+                        "?"
+                    ])
+
+        await pokehah.finish(msg)
+
+
+async def poke_(bot: Bot, event: Event, state: dict) -> bool:
+    return (event.detail_type == "notify" and event.raw_event["sub_type"] == "poke" and
+            event.sub_type == "notice" and int(event.self_id) == event.raw_event["target_id"])
+
+poke = on_notice(poke_, block=True)
+poke.handle()(_poke)
+
+
+groupEvent = on_notice()
+
+@groupEvent.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    group = str(event.group_id)
+    print(event.raw_event)
+
+    if banList(group):
+        if event.raw_event["notice_type"] == "group_increase":
+            await groupEvent.finish(f'好欸!事新人[CQ:at,qq={event.raw_event["user_id"]}]')
+            await groupEvent.finish(f"在下 ATRI,你可以叫我 亚托莉 或 アトリ !~w")
+
+        elif event.raw_event["notice_type"] == "group_decrease":
+            await groupEvent.finish(f'[{event.raw_event["operator_id"]}] 离开了我们...')
diff --git a/ATRI/plugins/plugin_pixiv/__init__.py b/ATRI/plugins/plugin_pixiv/__init__.py
new file mode 100644
index 0000000..5826b49
--- /dev/null
+++ b/ATRI/plugins/plugin_pixiv/__init__.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python3
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:38:49
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
+
+import re
+import json
+
+from nonebot.plugin import on_command
+from nonebot.adapters.cqhttp import Bot, Event
+
+from utils.utils_error import errorRepo
+from utils.utils_banList import banList
+from utils.utils_switch import checkSwitch
+from utils.utils_request import request_get
+
+
+plugin_name_0 = "pixiv-pic-search"
+pixivSearchIMG = on_command('p站搜图')
+
+@pixivSearchIMG.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    user = str(event.user_id)
+    group = str(event.group_id)
+
+    state["user"] = user
+    state["group"] = group
+
+    if banList(user, group):
+        if checkSwitch(plugin_name_0, group):
+            pid = str(event.message).strip()
+
+            if pid:
+                state["pid"] = pid
+        else:
+            await pixivSearchIMG.finish(f"Service-{plugin_name_0} has been closed.")
+
+@pixivSearchIMG.got("pid", prompt="请发送目标PID码") # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    pid = state["pid"]
+    pid = re.findall(r"\d+", pid)
+
+    if len(pid):
+        pass
+    else:
+        await pixivSearchIMG.reject("请发送纯阿拉伯数字的pid")
+
+    await bot.send_msg(
+        user_id=state["user"],
+        group_id=state["group"],
+        message="别急!在搜索了!"
+    )
+
+    URL = f"https://api.imjad.cn/pixiv/v1/?type=illust&id={pid}"
+    data = {}
+
+    try:
+        data = json.loads(request_get(URL))
+    except:
+        await pixivSearchIMG.finish(errorRepo("请求数据失败"))
+    
+    msg0 = f'[CQ:at,qq={state["user"]}]\n'
+    msg0 += f"Search result:\n"
+    msg0 += f"Pid: {pid}\n"
+    msg0 += f'Title {data["response"][0]["title"]}\n'
+    msg0 += f'W&H: {data["response"][0]["width"]}x{data["response"][0]["height"]}\n'
+    msg0 += f'Tags: {data["response"][0]["tags"]}\n'
+    msg0 += f'Account Name: {data["response"][0]["user"]["account"]}\n'
+    msg0 += f'Author Name: {data["response"][0]["user"]["name"]}\n'
+    msg0 += f'Link: https://www.pixiv.net/users/{data["response"][0]["user"]["id"]}\n'
+    msg0 += f'IMG: https://pixiv.cat/{pid}.jpg'
+
+    await pixivSearchIMG.finish(msg0)
+
+
+plugin_name_1 = "pixiv-author-search"
+pixivSearchAuthor = on_command("p站画师")
+
+@pixivSearchAuthor.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    user = str(event.user_id)
+    group = str(event.group_id)
+
+    state["user"] = user
+    state["group"] = group
+
+    if banList(user, group):
+        if checkSwitch(plugin_name_1, group):
+            author_id = str(event.message).strip()
+
+            if author_id:
+                state["author_id"] = author_id
+        else:
+            await pixivSearchAuthor.finish(f"Service-{plugin_name_1} has been closed.")
+
+@pixivSearchAuthor.got("author_id", prompt="请发送目标画师id") # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    author_id = state["author_id"]
+    author_id = re.findall(r"\d+", author_id)
+
+    if len(author_id):
+        pass
+    else:
+        await pixivSearchAuthor.reject("请发送纯阿拉伯数字的画师id")
+    
+    await bot.send_msg(
+        user_id=state["user"],
+        group_id=state["group"],
+        message=f"别急!在搜索了!\n将展示画师[{author_id}]的前三项作品"
+    )
+
+    URL = f"https://api.imjad.cn/pixiv/v1/?type=member_illust&id={author_id}"
+    data = {}
+
+    try:
+        data = json.loads(request_get(URL))
+    except:
+        await pixivSearchAuthor.finish(errorRepo("请求网络失败"))
+
+    for i in range(0,3):
+        pid = data["response"][i]["id"]
+        IMG = f"https://pixiv.cat/{author_id}.jpg"
+        data[i] = [f"{pid}", f"{IMG}"]
+    
+    msg0 = f'[CQ:at,qq={state["user"]}]\n'
+    
+    result = sorted(
+        data.items(),
+        key=lambda x:x[1],
+        reverse=True
+    )
+
+    t = 0
+
+    for i in result:
+        t += 1
+        msg = f"\n---------------\n"
+        msg += f"({t})\n"
+        msg += f"Pid: {i[1][0]}\n{i[1][1]}"
+        msg0 += msg
+    
+    await pixivSearchAuthor.finish(msg0)
+
+
+plugin_name_2 = "pixiv_rank"
+pixivRank = on_command("p站排行榜")
+
+@pixivRank.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    user = str(event.user_id)
+    group = str(event.group_id)
+
+    if banList(user, group):
+        if checkSwitch(plugin_name_2, group):
+
+            await bot.send_msg(
+                user_id=int(user),
+                group_id=int(group),
+                message="正在获取P站每日排行榜前五作品"
+            )
+
+            URL = "https://api.imjad.cn/pixiv/v1/?type=rank"
+            data = {}
+
+            try:
+                data = json.loads(request_get(URL))
+            except:
+                await pixivRank.finish(errorRepo("网络请求失败"))
+            
+            for i in range(0,5):
+                pid = data["response"][0]["works"][i]["work"]["id"]
+                IMG = f"https://pixiv.cat/{pid}.jpg"
+                data[i] = [f"{pid}", f"{IMG}"]
+            
+            msg0 = f"[CQ:at,qq={user}]"
+
+            result = sorted(
+                data.items(),
+                key=lambda x:x[1],
+                reverse=True
+            )
+
+            t = 0
+
+            for i in result:
+                t += 1
+                msg = "\n---------------\n"
+                msg += f"({t})\n"
+                msg += f"Pid: {i[1][0]}"
+                msg += f"{i[1][1]}"
+                msg0 += msg
+            
+            await pixivRank.finish(msg0)
+        
+        else:
+            await pixivRank.finish(f"Service-{plugin_name_2} has been closed.")
\ No newline at end of file
diff --git a/ATRI/plugins/plugin_rich/__init__.py b/ATRI/plugins/plugin_rich/__init__.py
index 2639188..99026a8 100644
--- a/ATRI/plugins/plugin_rich/__init__.py
+++ b/ATRI/plugins/plugin_rich/__init__.py
@@ -1,10 +1,18 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:40:34
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import re
 import json
 import requests
-from datetime import datetime
 
 from nonebot.log import logger
 from nonebot.plugin import on_message
diff --git a/ATRI/plugins/plugin_rich/body.py b/ATRI/plugins/plugin_rich/body.py
index 2c743c0..ae3d99b 100644
--- a/ATRI/plugins/plugin_rich/body.py
+++ b/ATRI/plugins/plugin_rich/body.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   body.py
+@Time    :   2020/10/11 14:40:43
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
 tr={}
diff --git a/ATRI/plugins/plugin_status/__init__.py b/ATRI/plugins/plugin_status/__init__.py
index ddd9e60..d51e2e9 100644
--- a/ATRI/plugins/plugin_status/__init__.py
+++ b/ATRI/plugins/plugin_status/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:40:55
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import psutil
 import sqlite3
diff --git a/ATRI/plugins/plugin_test/__init__.py b/ATRI/plugins/plugin_test/__init__.py
new file mode 100644
index 0000000..5a6fe96
--- /dev/null
+++ b/ATRI/plugins/plugin_test/__init__.py
@@ -0,0 +1,47 @@
+# !/usr/bin/env python3
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:35:26
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+@Desc    :   None
+'''
+__author__ = 'kyomotoi'
+
+import os
+from pathlib import Path
+from random import sample
+
+import nonebot
+from nonebot.plugin import on_command
+from nonebot.permission import SUPERUSER
+from nonebot.adapters.cqhttp import Bot, Event
+
+
+# 此目录下均为功能测试!
+
+
+testRecord = on_command('测试语音', permission=SUPERUSER)
+
+@testRecord.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    await testRecord.finish(f"[CQ:record,file=file:///{os.path.abspath(Path('.') / 'ATRI' / 'plugins' / 'plugin_test' / 'test.mp3')}]")
+
+
+testGroupList = on_command('获取群列表', permission=SUPERUSER)
+
+@testGroupList.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    group_list = await bot.get_group_list()
+    group = sample(group_list, 1)
+    print(group[0]['group_id'], type(group[0]['group_id']))
+
+testBot = on_command('获取bot', permission=SUPERUSER)
+
+@testBot.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    test_bot = nonebot.get_bots()
+    print(test_bot, type(test_bot.keys()))
\ No newline at end of file
diff --git a/ATRI/plugins/plugin_test/test.mp3 b/ATRI/plugins/plugin_test/test.mp3
new file mode 100644
index 0000000..774cf5d
Binary files /dev/null and b/ATRI/plugins/plugin_test/test.mp3 differ
diff --git a/ATRI/plugins/plugin_utils/__init__.py b/ATRI/plugins/plugin_utils/__init__.py
new file mode 100644
index 0000000..54abdeb
--- /dev/null
+++ b/ATRI/plugins/plugin_utils/__init__.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/17 21:16:59
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+@Docs    :   Thanks for mnixry idea! fork from https://github.com/mnixry/coolQPythonBot
+'''
+__author__ = 'kyomotoi'
+
+import os
+import json
+import random
+from pathlib import Path
+from time import strftime
+from zipfile import PyZipFile
+from typing import Tuple, Dict, List
+from datetime import datetime, timedelta
+
+from nonebot.plugin import on_command
+from nonebot.adapters.cqhttp import Bot, Event
+
+from utils.utils_banList import banList
+
+
+file = Path('.') / 'ATRI' / 'data' / 'data_IDcard' / 'main.bin'
+
+def infoID() -> Tuple[Dict[str, List[str]], Dict[str, str]]:
+    with PyZipFile(os.path.abspath(file), "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
+
+NAME, AREA = infoID()
+
+BIRTH_BEGIN = datetime(*[1980, 10, 10]) # type: ignore
+BIRTH_END = datetime(*[2002, 10, 10]) # type: ignore
+
+def numberID(area: int, sex: int, birth: int) -> str:
+    def checkSum(fullCode: str) -> int or str:
+        assert len(fullCode) == 17
+        checkSum = sum(
+            [((1 << (17 - i)) % 11) * int(fullCode[i]) for i in range(0, 17)]
+        )
+        checkDigit = (12 - (checkSum % 11)) % 11
+        if checkDigit < 10:
+            return checkDigit
+        else:
+            return "X"
+    
+    orderCode = str(random.randint(10, 99))
+    sexCode = str(random.randrange(sex, 10, step=2))
+    fullCode = str(area) + str(birth) + str(orderCode) + str(sexCode)
+    fullCode += str(checkSum(fullCode))
+    return fullCode
+
+
+plugin_name = "one-key-adult"
+generateID = on_command("我要转大人,一天打25小时游戏")
+
+@generateID.handle() # type: ignore
+async def _(bot: Bot, event: Event, state: dict) -> None:
+    user = str(event.user_id)
+    group = str(event.group_id)
+
+    if banList(user, group):
+        id_card_area = int(random.choice(list(AREA.keys())))
+        id_card_area_name = AREA[str(id_card_area)]
+        id_card_year_old = timedelta(days=random.randint(0, (BIRTH_END - BIRTH_BEGIN).days) + 1)
+        id_card_birth_day = strftime("%Y%m%d", (BIRTH_BEGIN + id_card_year_old).timetuple())
+        id_card_sex = random.choice([0, 1])
+        id_card_name = random.choice(NAME[{0: "female", 1: "male"}[id_card_sex]])
+        id_card_id = numberID(id_card_area, id_card_sex, id_card_birth_day)
+
+        msg0 = "恭喜,你已经成大人了!\n"
+        msg0 += "这是你一天25h游戏的通行证:\n"
+        msg0 += f"NumberID: {id_card_id}\n"
+        msg0 += f"Sex: {'男' if id_card_sex == 1 else '女'}\n"
+        msg0 += f"Name: {id_card_name} || Address: {id_card_area_name}\n"
+        msg0 += "注: 1、以上信息根据国家公开标准生成,非真实信息。\n"
+        msg0 += "     2、不适用于网易和腾讯。"
+
+        await generateID.finish(msg0)
diff --git a/BOT.py b/BOT.py
index 59b50d3..38b36d8 100644
--- a/BOT.py
+++ b/BOT.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   bot.py
+@Time    :   2020/10/11 14:36:01
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import time
 COPYRIGHT = (
diff --git a/README.md b/README.md
index 232c1e2..c7cc2a8 100644
--- a/README.md
+++ b/README.md
@@ -1,59 +1,7 @@
-**This project in rebuild now**
+# ATRI
 
-# ATRI————A project of pleasure
-アトリは、高性能ですから!
+## How to start
 
-[CN](README_CN.md)
-
-[![time tracker](https://wakatime.com/badge/github/Kyomotoi/ATRI.svg)](https://wakatime.com/badge/github/Kyomotoi/ATRI)
-[![Codacy Badge](https://app.codacy.com/project/badge/Grade/bef72993062f422f83e882c6d8e6f20e)](https://www.codacy.com/manual/Kyomotoi/ATRI?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=Kyomotoi/ATRI&amp;utm_campaign=Badge_Grade)
-## ABOUT
-This project name and inspiration from [ATRI-My Dear Moments-](https://atri-mdm.com/) by [ANIPLEX](https://aniplex-exe.com/).
-
-For Tencent QQ group add a lively ATRI is the goal of this project.
-
-The project leader, learn Python is still less than half a year, so i think the code of this project may increase your blood pressure. But i'll do it better!
-
-This project also serves as a good channel for me to learn Python. Thanks [Richard Chien](https://github.com/richardchien) and the Python-SDK: [NoneBot](https://github.com/nonebot/nonebot), them provided great help to this project.
-
-## ACHIEVE
-アトリ can run on all platforms.
-
-This project is completed by `go-CQHTTP + NoneBot` with `Python` as the main language.
-
-**The framework of the previous version is CoolQ, here to commemorate the suspension of CoolQ**
-
-**May we meet in a more open parallel world**
-
-## MORE INTRODUCTION
-This project is now formal edition, but the code is a entire hunk of shit.
-
-If you want to experience, you can join my Tencent QQ group: 567297659
-
-- Any more about functions: [THE DOOR](https://blog.lolihub.icu/#/ATRI/user)
-
-- Any more about install: [THE DOOR](https://blog.lolihub.icu/#/ATRI/install)
-
-AND
-
-~~If this project reach 100 stars and 30 forks, i'll put on skirt and show the photo on my blog~~
-
-## THANKS
-[Richard Chien](https://github.com/richardchien): [CQHTTP](https://github.com/richardchien/coolq-http-api) and [NoneBot](https://github.com/nonebot/nonebot).
-
-[mnixry](https://github.com/mnixry): Give advice.
-
-[JetBrains](https://www.jetbrains.com/) provides [PyCharm](https://www.jetbrains.com/pycharm/) authorization for this project.
-
-And them:
- - 50861735 11CNY
- - 1072324725 17CNY
- - 2862890179 func
- - AfdianUser_quGy 5CNY
- - 1752179928 45.14CNY
-
-## OTHER
-This project has been activated by [Afdian](https://afdian.net/@Kyomotoi), welcome to sponsor.
-
-## ABOUT OPEN SOURCE
-[GPLv3](https://github.com/Kyomotoi/Aya/blob/master/LICENSE)
+1. generate project using `nb create` .
+2. writing your plugins under `atri/plugins` folder.
+3. run your bot using `nb run` .
diff --git a/utils/utils_banList/__init__.py b/utils/utils_banList/__init__.py
index 66142cc..e7ccbec 100644
--- a/utils/utils_banList/__init__.py
+++ b/utils/utils_banList/__init__.py
@@ -1,11 +1,20 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:42:59
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import json
 from pathlib import Path
 from typing import Optional
 
-def banList(user: str, group: Optional[str] = None) -> bool:
+def banList(user: Optional[str] = None, group: Optional[str] = None) -> bool:
     """
     :说明:
 
@@ -13,8 +22,9 @@ def banList(user: str, group: Optional[str] = None) -> bool:
 
     :参数:
 
-      * ``user: str``: 用户QQ号
-      * ``group: Optional[str] = None``: 用户所在群号,若不传入则只检测用户
+      * ``user: Optional[str] = None``: 用户QQ号
+      * ``group: Optional[str] = None``: 用户所在群号
+      * !!!二者必须传入一个,否则一律返回 False !!!
 
     :返回:
       
@@ -42,14 +52,29 @@ def banList(user: str, group: Optional[str] = None) -> bool:
     except:
         data_group = {}
     
-    if user not in data_user:
-        if group:
-            if group not in data_group:
+    if user:
+        if user not in data_user:
+            if group:
+                if group not in data_group:
+                    return True
+                else:
+                    return False
+            else:
                 return True
+        else:
+            return False
+
+    elif group:
+        if group not in data_group:
+            if user:
+                if user not in data_user:
+                    return True
+                else:
+                    return False
             else:
-                return False
+                return True
         else:
-            return True
+            return False
+
     else:
-        print(3)
         return False
\ No newline at end of file
diff --git a/utils/utils_error/__init__.py b/utils/utils_error/__init__.py
index e037b30..2674018 100644
--- a/utils/utils_error/__init__.py
+++ b/utils/utils_error/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:43:10
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import json
 import string
@@ -9,8 +18,6 @@ from typing import Optional
 from datetime import datetime
 from traceback import format_exc
 
-from nonebot.rule import keyword
-
 def errorRepo(repo_msg: Optional[str] = None) -> str:
     """
     :说明:
@@ -23,7 +30,7 @@ def errorRepo(repo_msg: Optional[str] = None) -> str:
     
     :返回:
 
-      错误信息
+      错误堆栈
     
     :用法:
     
diff --git a/utils/utils_history/__init__.py b/utils/utils_history/__init__.py
index d6a6d33..74834d8 100644
--- a/utils/utils_history/__init__.py
+++ b/utils/utils_history/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:43:20
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import os
 import json
diff --git a/utils/utils_img/__init__.py b/utils/utils_img/__init__.py
new file mode 100644
index 0000000..1b8c767
--- /dev/null
+++ b/utils/utils_img/__init__.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:40:17
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
+
+import os
+import string
+import aiohttp
+import PIL.Image as Image
+from pathlib import Path
+from random import sample
+
+from PIL import Image
+from PIL import ImageFile
+
+async def aio_download_pics(url):
+    """
+    :说明:
+    
+      下载图片并重名文件
+    
+    :参数:
+
+      * ``URL: str``: 目标网址
+    
+    :返回:
+
+      文件根目录
+    
+    :用法:
+
+    .. code-block:: python
+
+        aio_download_pics(URL="https://www.demo.com/demo.jpg")
+
+    """
+    path = Path('.') / 'ATRI' / 'data' / 'data_Temp' / 'img'
+    path = os.path.abspath(path)
+    img_key = ''.join(sample(string.ascii_letters + string.digits, 16))
+    img = path + f'\\{img_key}.png'
+    async with aiohttp.ClientSession() as session:         
+        async with session.get(url) as response:                
+            pic = await response.read()    #以Bytes方式读入非文字                     
+            with open(img, mode='wb') as f:# 写入文件
+                f.write(pic)
+                f.close()
+    return img
+
+def compress_image(outfile: str, kb=400, quality=85, k=0.9) -> str:
+    """
+    :说明:
+    
+      不改变图片尺寸压缩到指定大小,输出 base64 ,完成后自动删除文件
+    
+    :参数:
+
+      * ``outfile: str``: 文件目录
+      * ``kb=150``: 目标文件大小,单位:KB
+
+    :返回:
+
+      base64
+
+    :用法:
+
+    .. code-block:: python
+
+        compress_image(outfile=C:/xxx)
+
+    """
+    o_size = os.path.getsize(outfile) // 1024
+    if o_size <= kb:
+        return outfile
+   
+    ImageFile.LOAD_TRUNCATED_IMAGES = True # type: ignore
+    while o_size > kb:
+        im = Image.open(outfile)
+        x, y = im.size
+        out = im.resize((int(x*k), int(y*k)), Image.ANTIALIAS)
+        try:
+            out.save(outfile, quality=quality)
+        except Exception as e:
+            print(e)
+            break
+        o_size = os.path.getsize(outfile) // 1024
+    return outfile
diff --git a/utils/utils_request/__init__.py b/utils/utils_request/__init__.py
index cc0992a..b32f372 100644
--- a/utils/utils_request/__init__.py
+++ b/utils/utils_request/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:43:55
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import requests
 from typing import Optional
diff --git a/utils/utils_switch/__init__.py b/utils/utils_switch/__init__.py
index 5c10a85..df7b877 100644
--- a/utils/utils_switch/__init__.py
+++ b/utils/utils_switch/__init__.py
@@ -1,5 +1,14 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
+'''
+@File    :   __init__.py
+@Time    :   2020/10/11 14:44:06
+@Author  :   Kyomotoi
+@Contact :   kyomotoiowo@gmail.com
+@Github  :   https://github.com/Kyomotoi
+@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved.
+'''
+__author__ = 'kyomotoi'
 
 import os
 import json
@@ -40,6 +49,9 @@ def checkSwitch(func_name: str, group: str) -> bool:
         data_switch_all["anime-pic-search"] = "True"
         data_switch_all["anime-vid-search"] = "True"
         data_switch_all["ai-face"] = "True"
+        data_switch_all["pixiv-pic-search"] = "True"
+        data_switch_all["pixiv-author-search"] = "True"
+        data_switch_all["pixiv-rank"] = "True"
 
         with open(file_switch_all, 'w') as f:
             f.write(json.dumps(data_switch_all))
@@ -59,6 +71,9 @@ def checkSwitch(func_name: str, group: str) -> bool:
         data_switch_alone["anime-pic-search"] = "True"
         data_switch_alone["anime-vid-search"] = "True"
         data_switch_alone["ai-face"] = "True"
+        data_switch_alone["pixiv-pic-search"] = "True"
+        data_switch_alone["pixiv-author-search"] = "True"
+        data_switch_alone["pixiv-rank"] = "True"
 
         with open(file_switch_alone, 'w') as f:
             f.write(json.dumps(data_switch_alone))
diff --git a/utils/utils_switch/switch.json b/utils/utils_switch/switch.json
index 9b6bb22..9fb8cfa 100644
--- a/utils/utils_switch/switch.json
+++ b/utils/utils_switch/switch.json
@@ -1 +1 @@
-{"anime-setu": "True", "anime-pic-search": "True", "anime-vid-search": "True", "all-off-anime-setu": "True"}
\ No newline at end of file
+{"anime-setu": "True", "anime-pic-search": "True", "anime-vid-search": "True", "all-off-anime-setu": "True", "ai-face": "True", "pixiv-pic-search": "True", "pixiv-author-search": "True", "pixiv-rank": "True"}
\ No newline at end of file
-- 
cgit v1.2.3