async def search_image(app: Mirai, group: Group, member: Member, cp: CommandParser, message: MessageChain): pa = cp.parse_with_valid(["[Image"]) if isinstance(pa, str): return await app.sendGroupMessage(group, [At(member.id), Plain(pa)]) elif not pa: return await app.sendGroupMessage(group, [At(member.id), Plain("参数不能为空")]) img = message.getFirstComponent(Image) with open(f"{ROOT}{str(img.imageId)}.jpg", "wb") as f: f.write((await img.toBytes()).getvalue()) try: _, raw = await wget(f"https://saucenao.com/search.php?output_type=2&testmode=0&numres=4&url=https://www.pixivdl.net/static/img/{str(img.imageId)}.jpg") finally: os.remove(f"{ROOT}{str(img.imageId)}.jpg") data = Parser.parse_raw(raw) if data.header.status != 0: print(raw) return await app.sendGroupMessage(group, [At(member.id), Plain(f"发生错误:status: {data.header.status}")]) result = ["查询结果:\n", f"作品类型:{DataBase.get(data.results[0].header.index_id)}\n", f"准确度:{data.results[0].header.similarity}%\n", f"剩余次数:{data.header.long_remaining}\n"] if data.results[0].header.index_id in (21, 22): # Anime, HAnime result.append(f"作品名:{data.results[0].data.source}\n") result.append(f"年份:{data.results[0].data.year}\n") result.append(f"目标位置:第{data.results[0].data.part}集,{data.results[0].data.est_time}\n") elif data.results[0].header.index_id in (5, 31, 33, 34): # Image result.append(f"标题:{data.results[0].data.title}\n") result.append(f"更多信息:{data.results[0].data.ext_urls[0]}") await app.sendGroupMessage(group, [At(member.id), *(Plain(msg) for msg in result)])
async def execute(app: Mirai, monitor: Monitor) -> None: # noinspection PyBroadException try: resp, groups = await monitor.run() if resp: EventLogger.info(f'{resp.name}直播:{resp.url}') if resp.cover: cover: Image = await app.uploadImage("group", await Image.fromRemote(resp.cover)) components = [Plain(f'(直播){resp.name}: {resp.title}\n{resp.url}\n'), cover] else: components = [Plain(f'(直播){resp.name}: {resp.title}\n{resp.url}')] tasks = [asyncio.create_task( app.sendGroupMessage(group=group_id, message=components) ) for group_id in groups] done, pending = await asyncio.wait(tasks) for task in done: if e := task.exception(): EventLogger.error(e) except ChannelResolveError as e: EventLogger.warning(e) except Exception: EventLogger.error(traceback.format_exc())
def getWeather(message,sender): global city point=message.toString()[25:] print("天气查询,城市:",point) if point not in city: return [ At(target=sender), Plain(text="请检查城市名称,只支持中国城市及部分地区哦~") ] weather_src=weatherSrc+point response=requests.get(weather_src) html=response.text html.replace("\/","/") html.replace("//",'/') html=html.encode('utf-8').decode('unicode_escape') wea=re.findall(r'wea":"(.*?)"',html,re.S)[0] tem=re.findall(r'"tem":"(.*?)"',html,re.S)[0] tem_day=re.findall(r'"tem_day":"(.*?)"',html,re.S)[0] tem_night=re.findall(r'"tem_night":"(.*?)"',html,re.S)[0] win=re.findall(r'"win":"(.*?)"',html,re.S)[0] win_speed=re.findall(r'"win_speed":"(.*?)"',html,re.S)[0] win_meter=re.findall(r'"win_meter":"(.*?)"',html,re.S)[0] air=re.findall(r'"air":"(.*?)"',html,re.S)[0] return [ Plain(text="%s今日天气\n"%point), Plain(text="天气情况:%s\n"%wea), Plain(text="实时温度:%s℃\n"%tem), Plain(text="最高温:%s℃\n"%tem_day), Plain(text="最低温:%s℃\n"%tem_night), Plain(text="风向:%s\n"%win), Plain(text="风力等级:%s\n"%win_speed), Plain(text="风速:%s\n"%win_meter), Plain(text="空气质量:%s"%air) ]
def chain_split(chain: MessageChain, split_str: str) -> List[MessageChain]: chain = fix_merge(chain) # 已经重新生成了一个 MessageChain(以list的形式) length = len(chain) result = [] last_str = None for index, component in enumerate(chain): if isinstance(component, Plain): char_lists = component.toString().split(split_str) if len(char_lists) > 1: result.append(MessageChain(__root__=[ Plain(splited_plain_string) for splited_plain_string in \ (char_lists[:-1] if index != length - 1 else char_lists) ])) if index != length - 1: last_str = char_lists[-1] else: last_str = None else: last_str = component.toString() else: result.append( MessageChain(__root__=[ *([Plain(last_str)] if last_str else []), component ])) return result
async def main(): for i in range(1, 13): Time = int(time.strftime("%I%M%S", time.localtime(time.time()))) if Time == (i * 10000): async with Session( f"mirai://localhost:8080/?authKey={authKey}&qq={qq}" ) as session: # 向个人报时 await session.sendFriendMessage( qqID, # 接受qq [ Image.fromFileSystem("./timeimg/{}.jpg".format( int(i))), Plain(text="Now time") ]) # 在群里报时 await session.sendGroupMessage( qqID, # 群组qq [ Image.fromFileSystem("./timeimg/{}.jpg".format( int(i))), Plain(text="Now time") ]) print('{}点已放送'.format(i)) break
def settingProcess(groupId,sender,config,change): if sender in getAdmin(groupId): if configChangeJudge(config,change): if config in adminConfig: updateSetting(groupId,config,settingCode[change]) record("setting:%s set to %s"%(config,change),"none",sender,groupId,True,"function") else: if not sender==HostQQ: record("setting:Insufficient permissions","none",sender,groupId,False,"function") return [ At(target=sender), Plain(text="Insufficient permissions!") ] else: if change.isnumeric(): updateSetting(groupId,config,change) else: updateSetting(groupId,config,settingCode[change]) record("setting:%s set to %s"%(config,change),"none",sender,groupId,True,"function") if (config=="real" or config=="setu") and change=="Enable" and (getSetting(groupId,"setu") and getSetting(groupId,"real")): updateSetting(groupId,"forbiddenCount",0) else: record("setting:command error","none",sender,groupId,False,"function") return [ At(target=sender), Plain("Command error!") ] return [ Plain(text="group:%d %s set to %s"%(groupId,config,change)) ] else: return [ At(target=sender), Plain(text="爬爬爬,你没有管理权限!离人家远一点啦!死变态!") ]
def translate(groupId,sender,text,source,target): url="https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate" # 请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效) t = time.time() time_stamp = str(int(t)) # 请求随机字符串,用于保证签名不可预测 nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10)) # 应用标志,这里修改成自己的id和key app_id = '' app_key = '' params = { 'app_id' : app_id, 'text' : text, 'time_stamp':time_stamp, 'nonce_str':nonce_str, 'source':source, 'target':target } sign_before = '' for key in sorted(params): sign_before += '{}={}&'.format(key, quote(params[key], safe='')) sign_before += 'app_key={}'.format(app_key) sign = curlmd5(sign_before) params['sign'] = sign r = requests.get(url,params=params) # print(r.text) record("translate %s->%s"%(source,target),"none",sender,groupId,True,"function") return [ At(target=sender), Plain("translate:\n"), Plain(text="%s"%r.json()["data"]["target_text"]) ]
def BVCoder(*attrs, **kwargs): def dec(x): r = 0 for i in range(6): r += tr[x[s[i]]] * 58**i return (r - add) ^ xor def enc(x): x = (x ^ xor) + add r = list('BV1 4 1 7 ') for i in range(6): r[s[i]] = table[x // 58**i % 58] return ''.join(r) table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' tr = {} for i in range(58): tr[table[i]] = i s = [11, 10, 3, 8, 4, 6] xor = 177451812 add = 8728348608 try: try: ostr = [Plain(text=enc(int(i)) + '\n') for i in attrs] except: ostr = [Plain(text='av' + str(dec(i)) + '\n') for i in attrs] except Exception as e: ostr = [Plain(text=str(e))] return ostr
async def hourcall(): now = datetime.now(pytz.timezone('Asia/Shanghai')) timetext = now.strftime('%H:%M:%S') msgformat = """【提醒买药小助手】 {0} 大家好,我是本群的“提醒买药小助手”,希望看到消息的人可以放下手中的其他事情打开PCR去买药吧。6小时后我会继续提醒大家去买药,和我一起成为每天买四次药的人吧。 附一张setu """ try: setu_msg = pixiv_setu.get_setu("normalrank") except Exception as e: print(e) setu_msg = [Plain(text="没有找到色图")] text = msgformat.format(timetext) print(text) msg = [Plain(text=text)] + setu_msg group_id_list = myconfig.group_medi_id_list try: for group_id in group_id_list: await app.sendGroupMessage(group_id, msg) # await app.sendGroupMessage(group_id, [Plain(text=f'现在时间 {timetext}')]) except Exception as e: print(e)
def 电笔记(*attrs, **kwargs): ins = ' '.join(attrs) if ins == 'reload': ret_msg = [Plain('知识库已更新,现有词条:\n')] for i in os.listdir('DigitalElectronicsTech'): if i[-6:] == '.json5': with open('DigitalElectronicsTech/' + i, 'r') as f: j = json5.load(f) for k, v in j.items(): ret_msg.append(Plain('\t- ' + k + '\n')) GLOBAL.DEKnowledge[k] = [ Plain(f'''{k}\n别名:{v['AN']}\n{v['desc']}''') ] if 'img' in v: for vi in v['img']: GLOBAL.DEKnowledge[k].append( Image.fromFileSystem( 'DigitalElectronicsTech/img/' + vi)) for an in v['AN']: GLOBAL.DEKnowledge[an] = GLOBAL.DEKnowledge[k] return ret_msg elif ins in GLOBAL.DEKnowledge: return GLOBAL.DEKnowledge[ins] else: return [Plain('不存在此条目')]
async def daily_pic(app: Mirai, group: Group, member: Member, message: MessageChain): matches = ['.setu', '来张色图', '来份色图', '不够色', '就这?'] if any(x in message.toString() for x in matches): ans = random.randint(0, 1) if ans: try: path = os.path.abspath(__file__) path = os.path.dirname(path) path = os.path.join(path, 'Tornado_webite_test') path = os.path.join(path, 'Pixiv') # print(path) pic_name = os.listdir(path) # print(pic_name) random_pic = os.path.join(path, random.choice(pic_name)) await app.sendGroupMessage(group.id, [ At(target=member.id), Image.fromFileSystem(random_pic), Plain(text="这是您点的一份色图~") ]) except (RuntimeError, ValueError, EnvironmentError, PermissionError, ConnectionRefusedError): print("send setu message error!") else: await app.sendGroupMessage(group.id, [ At(target=member.id), Plain(text="本烫不想理你"), Face(faceId=212), ])
def infoProcess(groupId,sender,check): if sender in getAdmin(groupId): if infoCheckJudge(check): if check in adminCheck: return showSetting(groupId,sender,check) else: if not sender==HostQQ: record("setting:Insufficient permissions","none",sender,groupId,False,"function") return [ At(target=sender), Plain(text="Insufficient permissions!") ] else: return showSetting(groupId,sender,check) else: record("setting:command error","none",sender,groupId,False,"function") return [ At(target=sender), Plain("Command error!") ] else: return [ At(target=sender), Plain(text="爬爬爬,你没有管理权限!离人家远一点啦!死变态!") ]
async def wipDDL(g, mb, tit, delays): print('delay:', delays) try: await asyncio.sleep(delays) with open(f'ddl/{g}', 'r') as fr: j = json.load(fr) del ddlQueuer[tit] del j[tit] with open(f'ddl/{g}', 'w') as fw: json.dump(j, fw) if delays > -10: if g >= 2**39: if random.randint(0, 4): await GLOBAL.app.sendGroupMessage( g - 2**39, [At(mb), Plain(tit + '大限已至,我扔掉了。')]) else: await GLOBAL.app.sendGroupMessage( g - 2**39, [At(mb), Plain(tit + '变臭力,只能扔了(悲')]) else: if random.randint(0, 4): await GLOBAL.app.sendFriendMessage( g, [Plain(tit + '大限已至,我扔掉了。')]) else: await GLOBAL.app.sendFriendMessage( g, [Plain(tit + '变臭力,只能扔了(悲')]) except Exception as e: print(e)
async def GMHandler(app: Mirai, group: Group, member: Member, message: GroupMessage): print(message) print(message.toString()) global RECORDS, STATUS if "醒醒不对劲" in message.toString(): STATUS = True await app.sendGroupMessage(group, [Plain(text="我还想再睡会儿!")]) if not STATUS: return if "报名" in message.toString(): try: message_handler(member, message.toString()) await app.sendGroupMessage(group, [Plain(text=format_table())]) except Exception: await app.sendGroupMessage(group, [Plain(text="糟糕,坑满啦!")]) elif "clear" in message.toString(): RECORDS = {} await app.sendGroupMessage(group, [Plain(text=format_table())]) elif "出来吧憨憨" in message.toString(): time.sleep(1) await app.sendGroupMessage(group, [Plain(text="余目才是憨批!")]) elif message.toString() == "/roll": await app.sendGroupMessage(group, [Plain(text=str(random.randint(0, 100)))]) elif "At::target=75960775" in message.toString(): if random.randint(0, 10) < 4: await app.sendGroupMessage( group, [Plain(text="喊我干啥,我又不是小爱同学"), Face(faceId=QQFaces['nanguo'])]) else: await app.sendGroupMessage(group, [Plain(text=random_words())]) elif "睡吧不对劲" in message.toString(): STATUS = False await app.sendGroupMessage(group, [ Plain(text="晚安~"), Image( type='Image', imageId='AD698F3D-FCEC-0516-C6DA-346967FF876E', url=HttpUrl( 'http://gchat.qpic.cn/gchatpic_new/843452214/1032083209-2934067879-AD698F3DFCEC0516C6DA346967FF876E/0?term=2', scheme='http', host='gchat.qpic.cn', tld='cn', host_type='domain', path= '/gchatpic_new/843452214/1032083209-2934067879-AD698F3DFCEC0516C6DA346967FF876E/0', query='term=2')) ]) else: num = random.randint(0, 100) if num < 10: time.sleep(1) await app.sendGroupMessage(group, [Plain(text=random_words())]) if random.randint(0, 100) < 30 and "At::target" not in message.toString(): WORDS.append(message.toString())
async def execute(app: Mirai) -> None: delay = 10 while True: targets = Database.load().__root__ if not targets: await asyncio.sleep(delay) continue for target in targets: if target.groups: try: await asyncio.sleep(delay) resp = await getDynamicStatus(target.uid) if resp: footer = f"\n\n动态地址: https://t.bilibili.com/{resp.dynamic_id}" EventLogger.info( f'{target.name}动态更新:https://t.bilibili.com/{resp.dynamic_id}' ) # noinspection PyTypeChecker,PydanticTypeChecker components = [Plain(resp.msg)] + \ [await app.uploadImage( 'group', await Image.fromRemote(url) ) for url in resp.imgs] + \ [Plain(footer)] [ asyncio.create_task( app.sendGroupMessage(group=group_id, message=components)) for group_id in target.groups ] except Exception as e: EventLogger.error(f'动态检查出错:{target.name} {e}') EventLogger.error(traceback.format_exc()) continue
async def aps_job(app: Mirai, msg: str, member: Member, isAll=False): if isAll: await app.sendGroupMessage(member.group, [AtAll(), Plain(text=msg)]) else: await app.sendGroupMessage( member.group, [At(target=member.id), Plain(text=msg)])
def 转电码(*attrs, **kwargs): global z2m, a2m msg = ' '.join(attrs).upper() conf = re.findall('''SPLIT=(.*?) ''', msg) split_symbol = '/' print(conf) if not conf: conf = re.findall('''SPLIT=(.*?)$''', msg) print(conf) if conf: split_symbol = conf[0] for i in conf: msg = msg.replace(f'''SPLIT={i}''', '') else: split_symbol = conf[0] for i in conf: msg = msg.replace(f'''SPLIT={i}''', '') msg = msg.replace(' ', '_') ans = [] cmsg = msg for i in msg: if i in z2m: cmsg = cmsg.replace(i, '_' + z2m[i] + '_') elif i not in z2m and i not in a2m: return [Plain(f'不合法的字符:{i}')] # while ' ' in cmsg: # cmsg = cmsg.replace(' ',' ') for i in cmsg: ans.append(a2m[i]) return [Plain(split_symbol.join(ans))]
async def Main(app: Mirai, group: Group, member: Member, message: MessageChain, source: Source): m_id = message.getSource() m_text = message.toString() if m_text.startswith("pkg"): if m_text == "pkg": await app.sendGroupMessage(group, [Plain(text="使用pkg+空格+包名来使用!")]) raise IndexError(message.toString()) try: await app.sendGroupMessage(group, [Plain(text="正在搜索...请稍后...")]) nn = await search(m_text[4:]) except IndexError: await app.sendGroupMessage(group, [Plain(text="未找到此包!")]) else: nnn = len(nn) if nnn > 2: nnnn = "" for i in range(nnn): if i > 6: break nnnn += nn[i]["pkgname"] + "\n" await app.sendGroupMessage(group, [Plain(text="搜索到了多个包:\n%s" % nnnn)]) else: text = tmp % (nn[0]["repo"], nn[0]["pkgname"], nn[0]["pkgver"], nn[0]["pkgdesc"], nn[0]["last_update"], nn[0]["url"]) await app.sendGroupMessage(group, [Plain(text=text)])
def 译电码(*attrs, **kwargs): global m2a msg = ' '.join(attrs).upper() conf = re.findall('''SPLIT=(.*?) ''', msg) split_symbol = '/' print(conf) if not conf: conf = re.findall('''SPLIT=(.*?)$''', msg) print(conf) if conf: split_symbol = conf[0] for i in conf: msg = msg.replace(f'''SPLIT={i}''', '') else: split_symbol = conf[0] for i in conf: msg = msg.replace(f'''SPLIT={i}''', '') msg = msg.replace(' ', '') ans = [] for i in msg.split(split_symbol): if i not in m2a: return [Plain(f'不合法的电码:{i}')] ans.append(m2a[i]) return [Plain(''.join(ans))]
async def event_gm(app: Mirai, gm: GroupMessage, group: Group, member: Member): async with aiohttp.ClientSession() as session: if str(type(gm.messageChain.__root__[1])) == "<class 'mirai.event.message.components.Plain'>": message = gm.messageChain.__root__[1].text if regex.compile('^#?(RWKK)?(?<keyword>.*)$', regex.I).match(message)[1] == 'RWKK': print('开始处理') keyword=regex.compile('^#?(RWKK)?(?<keyword>.*)$', regex.I).match(message)[2] if keyword == 'None': async with session.get('https://api.lolicon.app/setu/?apikey=408800685e6e285c17f744&size1200=true') as r: data =await r.json()['data'][0] else: async with session.get('https://api.lolicon.app/setu/?apikey=408800685e6e285c17f744&size1200=true&keyword=' + keyword) as r: data =await r.json()['data'][0] if await r.json()['code'] == '404': await app.sendGroupMessage(group,[Plain(text='弟啊你XP咋那么奇怪啊?')]) else: pid =data.get('pid') url = data.get('url') title = data.get('title') file = antishield(url, pid) if file == '0': await app.sendGroupMessage(group,[Plain(text='图片获取失败!')]) else: await app.sendGroupMessage(group, [Plain(text=f'标题:{title},ID:{pid}')]) message1 = urllib.parse.quote(f'[CQ:image,file={url}]') async with session.get(f"http://120.79.196.188:5700/send_group_msg?group_id={group.id}&message={message1}") as send: if await send.json().get('status') == 'ok': print('ok') await asyncio.sleep(15) async with session.get(f"http://120.79.196.188:5700/delete_msg?message_id={await send.json().get('data').get('message_id')}") as send1: print (send1.json())
def 爬OEIS(*attrs, **kwargs): if attrs: for i in attrs[0].split(','): if not i.isdigit(): return [Plain('输入格式需为半角逗号分隔的整数')] else: r = requests.get( f'http://oeis.org/search?fmt=data&q={attrs[0]}') s = BeautifulSoup(r.text, 'html.parser') resp = [] for i in s('table', attrs={ 'cellpadding': '0', 'cellspacing': '0', 'border': '0', 'width': '100%' }): try: #print(i) t1 = Plain('oeis.org' + i.tr.td.a['href'] + '\n') t2 = Plain('$$$'.join( list(i.next_sibling.next_sibling.tt.strings)) + '\n\n') resp.append(t1) resp.append(t2) except: pass return resp else: return [Plain('输入格式需为半角逗号分隔的整数')]
async def edit_config(app: Mirai, group: Group, member: Member, message: MessageChain): if member.id in conf.get("permission", "operator"): try: _, segment, block, method, value = message.toString().split(" ") except ValueError: await app.sendGroupMessage(group, [At(member.id), Plain("参数不足")]) return try: data = json.loads(value) except json.decoder.JSONDecodeError: data = value try: if method == "replace": conf.set(segment, block, data) elif method == "update": c = conf.get(segment, block) if isinstance(c, (list, tuple)): c.append(data) elif isinstance(c, dict): c.update(data) else: await app.sendGroupMessage( group, [At(member.id), Plain(f"未知方法:{method}")]) return await app.sendGroupMessage(group, [At(member.id), Plain("修改成功")]) except ValueError as e: await app.sendGroupMessage( group, [At(member.id), Plain(f"修改配置时发生错误:\n{e}")])
def 编码base64(*attrs, **kwargs): try: return [ Plain(text=str(base64.b64encode(bytes(i, 'utf-8'))) + '\n') for i in attrs ] except Exception as e: return [Plain(text=str(e))]
async def repeat(app: Mirai, group: Group, member: Member, cp: CommandParser): args = cp.parse_with_valid(("Int", ("Int", "String"))) # count, content if isinstance(args, str): return await app.sendGroupMessage(group, [At(member.id), Plain(args)]) if member.id not in admin and args[0][1] > 3: return await app.sendGroupMessage(group, [At(member.id), Plain("次数不能大于3")]) for _ in range(args[0][1]): await app.sendGroupMessage(group, [Plain(str(args[1][1]))])
def askSth(sender,question): return [ At(target=sender), Plain(text="啧啧啧,都多大了,还不会百度嘛,不会的话谷歌也行啊\n"), Plain(text="什么?你说还不会?你可真是个小憨批呢\n"), Plain(text="没办法呢,就让聪明的我来帮帮你吧!\n"), Plain(text="https://baidu.sagiri-web.com/?%s"%question) ]
async def get_list(app: Mirai, group: Group, member: Member): if member.id in conf.get("permission", "operator"): await app.sendGroupMessage(group, [ At(member.id), Plain("模块列表:"), Plain(json.dumps(conf.get("plugins", "active"), indent=2)) ]) else: await app.sendGroupMessage(group, [At(member.id), Plain("权限不足")])
def 营销生成器(*attrs,**kwargs): try: subject = attrs[0] event = attrs[1] event2 = attrs[2] synthesis = f'''{subject}{event}是怎么回事呢?{subject}相信大家都很熟悉,但是{subject}{event}是怎么回事呢,下面就让小编带大家一起了解吧。\r\n{subject}{event},其实就是{event2},大家可能会很惊讶{subject}怎么会{event}呢?但事实就是这样,小编也感到非常惊讶。\r\n这就是关于{subject}{event}的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!''' return [Plain(synthesis)] except Exception as e: return [Plain(str(e))]
async def rm_modules(app: Mirai, group: Group, member: Member, message: MessageChain): if member.id in conf.get("permission", "operator"): mp = message.toString().split(" ", 1)[1] conf.get("plugins", "active").remove(mp) await app.sendGroupMessage( group, [At(member.id), Plain("删除模块成功,将在下次重载生效")]) else: await app.sendGroupMessage(group, [At(member.id), Plain("权限不足")])
async def active_list(app: Mirai, group: Group, member: Member): if member.id not in conf.get("permission", "operator"): await app.sendGroupMessage(group, [At(member.id), Plain("权限不足")]) return await app.sendGroupMessage(group, [ At(member.id), Plain("已激活群组:"), Plain(json.dumps(conf.get("active", "group_id"), indent=2)) ])
async def Noticer(g, mb, kotoba, delays): print('delay:', delays) if delays < 0: return await asyncio.sleep(delays) if g >= 2**39: await GLOBAL.app.sendGroupMessage(g - 2**39, [At(mb), Plain(kotoba)]) else: await GLOBAL.app.sendFriendMessage(g, [Plain(kotoba)])