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))]]
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
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
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()))
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])
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
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()))
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:
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()))
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()))
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]