示例#1
0
async def getGroupSetting(groupId: int):
    options_bool = [
        "repeat", "frequency_limit", "setu", "real", "bizhi", "r18",
        "img_search", "bangumi_search", "debug", "compile", "anti_revoke",
        "online_notice", "switch"
    ]
    options_str = ["long_text_type", "r18_process", "speak_mode", "music"]
    valid_str_option_value = {
        "long_text_type": LongTextType.valid_values,
        "r18_process": R18Process.valid_values,
        "speak_mode": SpeakMode.valid_values,
        "music": Music.valid_values
    }
    bool_result = list(
        orm.fetchone(
            select(Setting.repeat, Setting.frequency_limit, Setting.setu,
                   Setting.real, Setting.bizhi, Setting.r18,
                   Setting.img_search, Setting.bangumi_search, Setting.debug,
                   Setting.compile, Setting.anti_revoke, Setting.online_notice,
                   Setting.switch).where(Setting.group_id == groupId)))[0]
    str_result = list(
        orm.fetchone(
            select(Setting.long_text_type, Setting.r18_process,
                   Setting.speak_mode,
                   Setting.music).where(Setting.group_id == groupId)))[0]
    return [[{
        "label": options_bool[i],
        "value": bool_result[i]
    } for i in range(len(bool_result))],
            [{
                "label": options_str[i],
                "value": str_result[i],
                "validValue": valid_str_option_value[options_str[i]]
            } for i in range(len(str_result))]]
示例#2
0
async def update_user_call_count_plus1(group: Group, member: Member, table_column, column_name: str) -> bool:
    new_value = list(orm.fetchone(
        select(table_column).where(UserCalledCount.group_id == group.id, UserCalledCount.member_id == member.id))
    )
    new_value = new_value[0][0] + 1 if new_value else 1
    try:
        orm.update(
            UserCalledCount,
            {"group_id": group.id, "member_id": member.id},
            {"group_id": group.id, "member_id": member.id, column_name: new_value}
        )
    except Exception:
        logger.error(traceback.format_exc())
        orm.session.rollback()
        return False
    try:
        if not column_name == "chat_count":
            new_id = list(orm.fetchone(select(FunctionCalledRecord.id).order_by(desc(FunctionCalledRecord.id)), 1))
            new_id = new_id[0][0] + 1 if new_id else 1
            orm.add(
                FunctionCalledRecord,
                {
                    "id": new_id,
                    "time": datetime.datetime.now(),
                    "group_id": group.id,
                    "member_id": member.id,
                    "function": column_name
                }
            )
    except Exception:
        logger.error(traceback.format_exc())
        orm.session.rollback()
    return True
示例#3
0
 def wrapper(*args, **kwargs):
     print(group.name, member.name)
     if result := orm.fetchone(
             select(UserPermission.level).where(
                 UserPermission.group_id == group.id
                 and UserPermission.member_id == member.id)):
         if result[0][0] >= level:
             return func(*args, **kwargs)
         else:
             print("等级不够呢~")
             return None
示例#4
0
    async def get_reply(member_id: int, group_id: int, content: str):
        if mode_now := list(orm.fetchone(select(Setting.speak_mode).where(Setting.group_id == group_id))):
            mode_now = mode_now[0][0]
            if mode_now == "normal":
                return None
            elif mode_now == "zuanLow":
                url = f"https://nmsl.shadiao.app/api.php?level=min&from={get_config('shadiaoAppName')}"
                async with aiohttp.ClientSession() as session:
                    async with session.get(url=url) as resp:
                        text = await resp.text()
            elif mode_now == "zuanHigh":
                url = f"https://nmsl.shadiao.app/api.php?from={get_config('shadiaoAppName')}"
                async with aiohttp.ClientSession() as session:
                    async with session.get(url=url) as resp:
                        text = await resp.text()
            elif mode_now == "rainbow":
                url = f"https://chp.shadiao.app/api.php?from={get_config('shadiaoAppName')}"
                async with aiohttp.ClientSession() as session:
                    async with session.get(url=url) as resp:
                        text = await resp.text()

            elif mode_now == "chat":
                text = await ChatReplyHandler.get_chat_reply(group_id, member_id, content)
            else:
                raise Exception(f"数据库群 <{group_id}> speak_mode项非法!目前值:{mode_now}")
            return MessageItem(MessageChain.create([Plain(text=text)]), AtSender(GroupStrategy()))
示例#5
0
 async def record(self, message: MessageChain, group: Group,
                  member: Member):
     await update_user_call_count_plus1(group, member,
                                        UserCalledCount.chat_count,
                                        "chat_count")
     content = "".join([plain.text for plain in message.get(Plain)])
     filter_words = re.findall(r"\[mirai:(.*?)\]", content, re.S)
     for i in filter_words:
         content = content.replace(f"[mirai:{i}]", "")
     if content:
         seg_result = jieba.lcut(content)
         if not seg_result:
             return None
         new_id = list(
             orm.fetchone(
                 select(ChatRecord.id).order_by(desc(ChatRecord.id)), 1))
         new_id = new_id[0][0] + 1 if new_id else 1
         try:
             orm.add(
                 ChatRecord, {
                     "id": new_id,
                     "time": datetime.datetime.now(),
                     "group_id": group.id,
                     "member_id": member.id,
                     "content": content,
                     "seg": "|".join(seg_result)
                 })
         except Exception as e:
             logger.error(traceback.format_exc())
             orm.session.rollback()
 async def get_chat_session(group_id: int, member_id: int) -> str:
     if result := list(
             orm.fetchone(
                 select(ChatSession.member_session).where(
                     ChatSession.group_id == group_id,
                     ChatSession.member_id == member_id))):
         return str(result[0][0])
示例#7
0
async def user_permission_require(group: Group, member: Member, level: int) -> bool:
    if result := list(orm.fetchone(
        select(
            UserPermission.level
        ).where(
            UserPermission.group_id == group.id,
            UserPermission.member_id == member.id
        )
    )):
        return True if result[0][0] >= level else False
示例#8
0
    async def delete_keyword(app: GraiaMiraiApplication, group: Group,
                             member: Member,
                             message_serialization: str) -> MessageItem:
        _, keyword = message_serialization.split("#")
        if re.match(r"\[mirai:image:{.*}\..*]", keyword):
            keyword = re.findall(r"\[mirai:image:{(.*?)}\..*]", keyword,
                                 re.S)[0]
        if record := list(
                orm.fetchone(
                    select(TriggerKeyword.function).where(
                        TriggerKeyword.keyword == keyword))):
            await app.sendGroupMessage(
                group,
                MessageChain.create([
                    Plain(text=
                          f"查找到以下信息:\n{keyword} -> {record[0][0]}\n是否删除?(是/否)")
                ]))
            inc = InterruptControl(AppCore.get_core_instance().get_bcc())

            @Waiter.create_using_function([GroupMessage])
            def confirm_waiter(waiter_group: Group, waiter_member: Member,
                               waiter_message: MessageChain):
                if all([
                        waiter_group.id == group.id,
                        waiter_member.id == member.id
                ]):
                    if re.match(r"[是否]", waiter_message.asDisplay()):
                        return waiter_message.asDisplay()
                    else:
                        return ""

            result = await inc.wait(confirm_waiter)

            if not result:
                return MessageItem(
                    MessageChain.create([Plain(text="非预期回复,进程退出")]),
                    Normal(GroupStrategy()))
            elif result == "是":
                orm.delete(TriggerKeyword, {"keyword": keyword})
                return MessageItem(
                    MessageChain.create([Plain(text=f"关键词 {keyword} 删除成功")]),
                    Normal(GroupStrategy()))
            else:
                return MessageItem(MessageChain.create([Plain(text="进程退出")]),
                                   Normal(GroupStrategy()))
示例#9
0
    async def update_keyword(message: MessageChain,
                             message_serialization: str) -> MessageItem:
        _, keyword, reply = message_serialization.split("#")
        keyword_type = "text"
        reply_type = "text"

        if re.match(r"\[mirai:image:{.*}\..*]", keyword):
            keyword = re.findall(r"\[mirai:image:{(.*?)}\..*]", keyword,
                                 re.S)[0]
            keyword_type = "img"

        if re.match(r"\[mirai:image:{.*}\..*]", reply):
            reply_type = "img"
            image: Image = message[Image][
                0] if keyword_type == "text" else message[Image][1]
            async with aiohttp.ClientSession() as session:
                async with session.get(url=image.url) as resp:
                    content = await resp.read()
            reply = base64.b64encode(content)
        else:
            reply = reply.encode("utf-8")

        m = hashlib.md5()
        m.update(reply)
        reply_md5 = m.hexdigest()

        try:
            if result := list(
                    orm.fetchone(
                        select(KeywordReply).where(
                            KeywordReply.keyword == keyword,
                            KeywordReply.reply_type == reply_type,
                            KeywordReply.reply_md5 == reply_md5))):
                print(result)
                return MessageItem(
                    MessageChain.create([Plain(text=f"重复添加关键词!进程退出")]),
                    Normal(GroupStrategy()))
            else:
示例#10
0
async def execute_grant_permission(group: Group, member: Member,
                                   message_text: str) -> MessageItem:
    if await user_permission_require(group, member, 3):
        message_text = message_text[13:]
        try:
            target, level = message_text.split(" ")
        except ValueError:
            return MessageItem(
                MessageChain.create(
                    [Plain("格式错误!使用方法:user -grant @user level[1-3]")]),
                QuoteSource(GroupStrategy()))
        target = int(target)
        if level.isdigit():
            level = int(level)
            if 1 <= level <= 2:
                if result := list(
                        orm.fetchone(
                            select(UserPermission.level).where(
                                UserPermission.group_id == group.id,
                                UserPermission.member_id == target))):
                    if result[0][0] == 3:
                        if await user_permission_require(group, member, 4):
                            return await grant_permission_process(
                                group.id, target, level)
                        else:
                            return MessageItem(
                                MessageChain.create([
                                    Plain(
                                        text=
                                        "权限不足,你必须达到权限等级4(master level)才可对超级管理员权限进行修改!"
                                    )
                                ]), Normal(GroupStrategy()))
                    else:
                        return await grant_permission_process(
                            group.id, target, level)
                else:
                    return await grant_permission_process(
                        group.id, target, level)
            elif level == 3:
                if await user_permission_require(group, member, 4):
                    return await grant_permission_process(
                        group.id, target, level)
                else:
                    return MessageItem(
                        MessageChain.create([
                            Plain(
                                text=
                                "格式错误!权限不足,你必须达到权限等级4(master level)才可对超级管理员进行授权!"
                            )
                        ]), Normal(GroupStrategy()))
            else:
                return MessageItem(
                    MessageChain.create([
                        Plain(
                            "level值非法!合法level值:1-3\n1: user\n2: administrator\n3: super administrator"
                        )
                    ]), QuoteSource(GroupStrategy()))
        else:
            return MessageItem(
                MessageChain.create(
                    [Plain("格式错误!使用方法:user -grant @user level[1-3]")]),
                QuoteSource(GroupStrategy()))
示例#11
0
class GroupWordCloudGeneratorHandler(AbstractHandler):
    __name__ = "GroupWordCloudGeneratorHandler"
    __description__ = "群词云生成器"
    __usage__ = "在群中发送 `我的月/年内总结` 即可查看个人月/年词云\n在群众发送 `本群月/年内总结` 即可查看群组月/年词云(需要权限等级2)"

    async def handle(self, app: GraiaMiraiApplication, message: MessageChain,
                     group: Group, member: Member):
        message_text = message.asDisplay()
        if message_text == "我的月内总结":
            await update_user_call_count_plus1(group, member,
                                               UserCalledCount.functions,
                                               "functions")
            set_result(message, await self.get_review(group, member, "month",
                                                      "member"))
        elif message_text == "我的年内总结":
            await update_user_call_count_plus1(group, member,
                                               UserCalledCount.functions,
                                               "functions")
            set_result(message, await self.get_review(group, member, "year",
                                                      "member"))
        elif message_text == "本群月内总结":
            await update_user_call_count_plus1(group, member,
                                               UserCalledCount.functions,
                                               "functions")
            set_result(message, await self.get_review(group, member, "month",
                                                      "group"))
        elif message_text == "本群年内总结":
            await update_user_call_count_plus1(group, member,
                                               UserCalledCount.functions,
                                               "functions")
            set_result(message, await self.get_review(group, member, "year",
                                                      "group"))
        else:
            return None

    @staticmethod
    async def count_words(sp, n):
        w = {}
        for i in sp:
            if i not in w:
                w[i] = 1
            else:
                w[i] += 1
        top = sorted(w.items(), key=lambda item: (-item[1], item[0]))
        top_n = top[:n]
        return top_n

    @staticmethod
    async def filter_label(label_list: list) -> list:
        not_filter = ["草"]
        image_filter = "mirai:"
        result = []
        for i in label_list:
            if image_filter in i:
                continue
            elif i in not_filter:
                result.append(i)
            elif len(i) != 1 and i.find('nbsp') < 0:
                result.append(i)
        return result

    @staticmethod
    async def draw_word_cloud(read_name) -> bytes:
        mask = np.array(IMG.open(f'statics/wordcloud/back.jpg'))
        # print(mask.shape)
        wc = WordCloud(
            font_path=f'statics/fonts/STKAITI.TTF',
            background_color='white',
            # max_words=500,
            max_font_size=100,
            width=1920,
            height=1080,
            mask=mask)
        name = []
        value = []
        for t in read_name:
            name.append(t[0])
            value.append(t[1])
        for i in range(len(name)):
            name[i] = str(name[i])
        dic = dict(zip(name, value))
        # print(dic)
        # print(len(dic.keys()))
        wc.generate_from_frequencies(dic)
        image_colors = ImageColorGenerator(mask, default_color=(255, 255, 255))
        # print(image_colors.image.shape)
        wc.recolor(color_func=image_colors)
        plt.imshow(wc.recolor(color_func=image_colors),
                   interpolation="bilinear")
        plt.axis("off")
        bytes_io = BytesIO()
        img = wc.to_image()
        img.save(bytes_io, format='PNG')
        return bytes_io.getvalue()

    @staticmethod
    @frequency_limit_require_weight_free(3)
    async def get_review(group: Group, member: Member, review_type: str,
                         target: str) -> MessageItem:
        group_id = group.id
        member_id = member.id
        time = datetime.now()
        time_right = time.strftime("%Y-%m-%d %H:%M:%S")
        if review_type == "year":
            timep = time - relativedelta(years=1)
            time_left = (time -
                         relativedelta(years=1)).strftime("%Y-%m-%d %H:%M:%S")
            tag = "年内"
        elif review_type == "month":
            timep = time - relativedelta(months=1)
            time_left = (time -
                         relativedelta(years=1)).strftime("%Y-%m-%d %H:%M:%S")
            tag = "月内"
        else:
            return MessageItem(
                MessageChain.create(
                    [Plain(text="Error: review_type invalid!")]),
                QuoteSource(GroupStrategy()))

        sql = select(ChatRecord).where(
            ChatRecord.group_id == group_id,
            ChatRecord.member_id == member_id if target == "member" else True,
            ChatRecord.time < time, ChatRecord.time > timep)

        if not (res := list(orm.fetchall(sql))):
            return MessageItem(MessageChain.create([Plain(text="没有你的发言记录呐~")]),
                               QuoteSource(GroupStrategy()))
        texts = []
        for i in res:
            if i[5]:
                texts += i[5].split("|")
            else:
                texts.append(i[3])
        top_n = await GroupWordCloudGeneratorHandler.count_words(texts, 20000)

        sql = select([func.count()]).select_from(ChatRecord).where(
            ChatRecord.group_id == group_id,
            ChatRecord.member_id == member_id if target == "member" else True,
            ChatRecord.time < time, ChatRecord.time > timep)
        if not (res := list(orm.fetchone(sql))):
            return MessageItem(MessageChain.create([Plain(text="没有你的发言记录呐~")]),
                               QuoteSource(GroupStrategy()))
示例#12
0
async def get_setting(group_id: int, setting) -> Union[bool, str]:
    if result := list(orm.fetchone(select(setting).where(Setting.group_id == group_id))):
        return result[0][0]