async def shouquan(session: CommandSession): try: ev = session.event if ev.self_id != five: return None if session.current_arg: if (res := re.match(r'(\d+) (\d+) ([01234])', session.current_arg)): group_id = str(res.group(1)) days = int(res.group(2)) groupType = int(res.group(3)) if group_id in 购买记录: 群信息 = 购买记录[group_id] 群信息['days'] += days if groupType != 0: 群信息['groupType'] = groupType else: 购买记录[group_id] = {'days': days, 'groupType': groupType} 群信息 = 购买记录[group_id] 购买记录write_json() await session.send(f"\n添加成功\n群号: {group_id}\n天数: {群信息['days']}\n类型: {群信息['groupType']}", at_sender=True) readyToDelete = [] for group_id, value in group_list.items(): group_id = str(group_id) if group_id in 购买记录 and 购买记录[group_id]['days'] >= 0: flag = value['flag'] sub_type = value['sub_type'] self_id = value['self_id'] group_name = value['group_name'] at2 = MessageSegment.at(value['user_id']) try: await session.bot.set_group_add_request(self_id=self_id, flag=flag, sub_type=sub_type, approve=True) await session.bot.send_group_msg(self_id=self_id, group_id=messageGroup, message=f'{at2}\n检测到该群的授权,已自动同意\n✅群号:{group_id}\n✅群名:{group_name}') await session.bot.send_group_msg(self_id=self_id, group_id=messageGroup2, message=f'{at2}\n检测到该群的授权,已自动同意\n✅群号:{group_id}\n✅群名:{group_name}') except Exception as e: await session.bot.send_group_msg(self_id=self_id, group_id=messageGroup, message=f'{at2}\n检测到该群的授权,自动同意失败\n❗群号:{group_id}\n❗群名:{group_name}\n{e}') await session.bot.send_group_msg(self_id=self_id, group_id=messageGroup2, message=f'{at2}\n检测到该群的授权,自动同意失败\n❗群号:{group_id}\n❗群名:{group_name}\n{e}') readyToDelete.append(int(group_id)) for group_id in readyToDelete: del group_list[int(group_id)] else: raise Exception('添加授权 <群号> <天数> [类型]\n[类型]: 0无 1原 2半 3略 4测') else:
async def _(session: NLPSession): global tmp_dict, ban_dict if session.ctx['message_type'] == 'group': # 判断是否为群信息 gid = session.ctx['group_id'] # 获取群号 if gid in groupconf and session.ctx['raw_message'] == tmp_dict[gid]: if not ban_dict[gid]: ban_dict[gid] = True await session.send(tmp_dict[gid]) else: ban_dict[gid] = False tmp_dict[gid] = session.ctx['raw_message'] msg_num = wordCut(tmp_dict[gid]) if msg_num: msg = MessageSegment.at( session.ctx['user_id']) + " " + Aconf[msg_num] await session.send(msg) else: return
async def call_subscribe(bot:NoneBot, ctx:Context_T, round_:int, boss:int): bm = BattleMaster(ctx['group_id']) msg = [] sub = _load_sub(bm.group) slist = sub.get_sub_list(boss) mlist = sub.get_memo_list(boss) tlist = sub.get_tree_list() if slist: msg.append(f"您们预约的老{BattleMaster.int2kanji(boss)}出现啦!") msg.extend(_gen_namelist_text(bm, slist, mlist, do_at=True)) if slist and tlist: msg.append("==========") if tlist: msg.append(f"以下成员可以下树了") msg.extend(map(lambda x: str(ms.at(x)), tlist)) sub.clear_tree() _save_sub(sub, bm.group) if msg: await bot.send(ctx, '\n'.join(msg), at_sender=False) # do not at the sender
async def _growth(session: CommandSession): r = db.queryExp(session.ctx['user_id'], session.current_arg) reply = str(MessageSegment.at(session.ctx['sender']['user_id']) ) if session.ctx['message_type'] == 'group' else '' if r[0]: reply += '上次浇水时间: %s, 获得成长值: %d点' % (r[0][2], r[0][3]) tplt = "\n{}\t{}\t{}" if len(session.current_arg) > 0: l = await get_group_member_list(601691323) p_l = { i['user_id']: (i['card'] if len(i['card']) > 0 else i['nickname']) for i in l } # qq: 群备注 or qq: 昵称 f_list = [] rank = 1 liking = r[2][0][1] c_tuple = None count = 1 for i in r[2]: if i[0] not in p_l: continue if liking > i[1]: rank = count liking = i[1] f_list.append((rank, p_l[i[0]], *i)) # 有记录 if i[0] == session.ctx['user_id']: c_tuple = (rank, p_l[i[0]], *i) count += 1 if len(f_list) > 10: f_list = f_list[0:9] if c_tuple: f_list.append(c_tuple) #生成回复 reply += tplt.format(rpad("排名", 4), rpad("昵称", 20), rpad("贡献度", 5)) for i in f_list: reply += tplt.format(rpad(i[0], 4), rpad(i[1], 20), rpad(i[3], 5)) else: reply += tplt.format(rpad("树名", 10), rpad("等级", 12), rpad("成长值", 15)) for i in r[1]: reply += tplt.format(rpad(i[0], 10), rpad(i[2], 12), rpad(str(i[1]) + '\\' + str(i[3]), 15)) await session.send(reply)
async def gacha_1(session: CommandSession): uid = session.ctx['user_id'] at = str(MessageSegment.at(session.ctx['user_id'])) if not check_gacha_num(uid): await session.finish(f'{at} {GACHA_EXCEED_NOTICE}') _user_gacha_count[uid] += 0.1 gacha = Gacha() chara, hiishi = gacha.gacha_one(gacha.up_prob, gacha.s3_prob, gacha.s2_prob) silence_time = hiishi * 60 res = f'{chara.name} {"★"*chara.star}' if get_bot().config.IS_CQPRO: res = f'{chara.icon.cqcode} {res}' await silence(session.ctx, silence_time) msg = f'{at}\n素敵な仲間が増えますよ!\n{res}' await session.send(msg)
async def show_remain(session: CommandSession): print(f'[{datetime.now()} show_remain] Function called') parser = ArgumentParser(session=session, usage='show-remain [--cid]') parser.add_argument('--cid', type=int, default=1) args = parser.parse_args(session.argv) print(f'[{datetime.now()} show_remain] arguments parsed') group_id = session.ctx['group_id'] cid = args.cid print(f'[{datetime.now()} show_remain] getting BattleMaster...') battlemaster = BattleMaster(group_id) print(f'[{datetime.now()} show_remain] got BattleMaster!') print( f'[{datetime.now()} show_remain] call battlemaster.list_challenge_remain' ) stat = battlemaster.list_challenge_remain(cid, datetime.now()) print(f'[{datetime.now()} show_remain] got remain stat') print(f'[{datetime.now()} show_remain] checking permission') is_admin = await check_permission(session.bot, session.ctx, GROUP_ADMIN) print(f'[{datetime.now()} show_remain] permission: is_admin={is_admin}') print(f'[{datetime.now()} show_remain] generating message...') msg1 = [] for uid, alt, name, rem_n, rem_e in stat: if rem_n or rem_e: line = ( str(MessageSegment.at(uid)) if is_admin else name ) + \ ( f'的小号{alt} ' if alt else '' ) + \ ( f' 余{rem_n}刀 补时{rem_e}刀\n' if rem_e else f'余{rem_n}刀\n' ) msg1.append(line) print(f'[{datetime.now()} show_remain] message prepared! sending...') if msg1: await session.send('今日余刀统计:\n' + ''.join(msg1)) else: await session.send(f'{cid}会所有成员均已出完刀!各位辛苦了!') print(f'[{datetime.now()} show_remain] Function finished successfully.')
async def gacha_10(session: CommandSession): print(f'[{datetime.now()} gacha_10] Function called') if not check_gacha_permission(session.ctx['group_id']): await session.finish(GACHA_DISABLE_NOTICE) print(f'[{datetime.now()} gacha_10] No permission. Function finished.') return SUPER_LUCKY_LINE = 170 at = str(MessageSegment.at(session.ctx['user_id'])) gacha = Gacha() result, hiishi = gacha.gacha_10() silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60 if USE_PRO_VERSION: # 转成CQimg result = [(CharaHelper.get_id(x), star, 0) for x, star in result] res1 = CharaHelper.gen_team_pic(result[:5], star_slot_verbose=False) res2 = CharaHelper.gen_team_pic(result[5:], star_slot_verbose=False) res = CharaHelper.concat_team_pic([res1, res2]) res = CharaHelper.pic2b64(res) res = MessageSegment.image(res) else: result = [f'{x}{"★"*star}' for x, star in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res1}\n{res2}' # await delete_msg(session) await silence(session, silence_time) msg = f'{at}\n素敵な仲間が増えますよ!\n{res}' # print(msg) print(f'[{datetime.now()} gacha_10] len(msg)={len(msg)}') await session.send(msg) if hiishi >= SUPER_LUCKY_LINE: await session.send('恭喜海豹!おめでとうございます!') print(f'[{datetime.now()} gacha_10] Function finished successully.')
async def store_command(session: CommandSession): account = session.state['account'] reply = str(MessageSegment.image(account.avatar_url)) item_list=f'欢迎 {session.ctx["sender"]["nickname"]} 来到nana的神秘商店\n'\ f'编号\t\t商品\t\t金额\n' with open(settings.GOODS_LIST, mode='r', encoding='utf-8') as f: for line in f: #print(line.strip()) iid, commodity, price = line.strip().split('|') ass=iid+'\t'+commodity+'\t'+price+'\n' item_list+=iid+'\t'+commodity+'\t'+price+'\n' if session.ctx['message_type'] != 'private': reply += '\n' + str(MessageSegment.at(session.ctx['user_id'])) ''' reply += f'\n欢迎 {session.ctx["sender"]["nickname"]} 来到nana的神秘商店\n' \ '本店有以下商品\n'\ '1 测试\n'\ '2 测试\n'\ '3 测试\n' ''' #await buy(item) await session.send(item_list)
async def sign_in(session: CommandSession): ctx_id = context_id(session.ctx, mode='user') my_data = data[ctx_id] today = date.today() if my_data['last_signin_date'] and \ today - my_data['last_signin_date'] < timedelta(days=1): session.finish('你今天已经签过到啦\n明天再来吧~') my_data['last_signin_date'] = today my_data['signin_count'] += 1 earned = random.randint(1, 100) data[ctx_id]['wealth'] += earned url = QQ_AVATAR_URL_FORMAT.format(session.ctx['user_id']) reply = str(MessageSegment.image(url)) if session.ctx['message_type'] != 'private': reply += '\n' + str(MessageSegment.at(session.ctx['user_id'])) reply += f'\n你已经累计签到了{my_data["signin_count"]}次\n' \ f'本次签到获得了{earned}个金币~' session.finish(reply)
async def gacha_1(session: CommandSession): if not check_gacha_permission(session.ctx['group_id']): await session.finish(GACHA_DISABLE_NOTICE) return at = str(MessageSegment.at(session.ctx['user_id'])) gacha = Gacha() res, star, hiishi = gacha.gacha_one(gacha.up_prob, gacha.s3_prob, gacha.s2_prob) silence_time = hiishi * 60 if USE_PRO_VERSION: # 转成CQimg res = get_cqimg(CharaHelper.get_picname(CharaHelper.get_id(res)), 'priconne/unit') + f'{res} {"★"*star}' # await delete_msg(session) await silence(session, silence_time) msg = f'{at}\n素敵な仲間が増えますよ!\n{res}' # print(msg) print('len(msg)=', len(msg)) await session.send(msg)
async def _arena_query(session: CommandSession, region: int, refresh=False): arena.refresh_quick_key_dic() ev = session.event uid = ev.user_id isAt = True if session.event.detail_type == 'group' else False if not lmt.check(uid): await session.finish('您查询得过于频繁,请稍等片刻', at_sender=isAt) lmt.start_cd(uid) # 处理输入数据 defen = session.current_arg defen = re.sub(r'[??,,_]', '', defen) defen, unknown = chara.roster.parse_team(defen) if unknown: _, name, score = chara.guess_id(unknown) if score < 70 and not defen: return # 忽略无关对话 msg = f'无法识别"{unknown}"' if score < 70 else f'无法识别"{unknown}" 您说的有{score}%可能是{name}' await session.finish(msg, at_sender=isAt) if not defen: await session.finish('查询请发送"怎么拆+防守队伍",无需+号', at_sender=isAt) if len(defen) > 5: await session.finish('编队不能多于5名角色', at_sender=isAt) if len(defen) < 5: await session.finish('编队不能少于5名角色', at_sender=isAt) if len(defen) != len(set(defen)): await session.finish('编队中含重复角色', at_sender=isAt) if any(chara.is_npc(i) for i in defen): await session.finish('编队中含未实装角色', at_sender=isAt) if 1004 in defen: await session.send('\n⚠️您正在查询普通版炸弹人\n※万圣版可用万圣炸弹人/瓜炸等别称', at_sender=isAt) # 预处理缓存图片 outpath = R.img('tmp/').path defen_list = defen.copy() defen_list.sort() filename = '-'.join(str(v) for v in defen_list) filename = f'{filename}.jpg' if os.path.exists(outpath) is False: os.mkdir(outpath) save_path = R.img('tmp/', filename).path if refresh and os.path.exists(save_path): os.remove(save_path) # 执行查询 # sv.logger.info('Doing query...') res = await arena.do_query(id_list=defen, user_id=uid, region=region, force=refresh) # sv.logger.info('Got response!') # 处理查询结果 if isinstance(res, str): await session.finish(f'查询出错,{res}', at_sender=isAt) if not len(res): await session.finish( '抱歉没有查询到解法\n※没有作业说明随便拆 发挥你的想象力~★\n作业上传请前往pcrdfans.com', at_sender=isAt) res = res[:min(6, len(res))] # 限制显示数量,截断结果 # 第一次查询,无本地缓存 if os.path.exists(save_path) is False: size = len(res) target = Image.new('RGBA', (64 * 6, 64 * size), (255, 255, 255, 255)) draw = ImageDraw.Draw(target) ttffont = ImageFont.truetype(font_path, 16) index = 0 for v in res: atk = v['atk'] team_pic = chara.gen_team_pic(atk) up = v['up'] + v['my_up'] down = v['down'] + v['my_down'] qkey = v['qkey'] pingjia = f'{qkey}\n\U0001F44D{up}\n\U0001F44E{down}' draw.text((64 * 5, 64 * index), pingjia, font=ttffont, fill='#000000') target.paste(team_pic, (0, 64 * index)) index += 1 target = optimize_pic(target) target.save(save_path, format='JPEG', quality=50, optimize=True, progressive=True) # 拼接回复 atk_team = MessageSegment.image(f'file:///{os.path.abspath(save_path)}') defen = [chara.fromid(x).name for x in defen] defen = f"防守方【{' '.join(defen)}】" at = str(MessageSegment.at(ev.user_id)) if isAt else ev.sender['nickname'] msg = [defen, f'已为骑士{at}查询到以下进攻方案:', str(atk_team), '※发送"点赞/点踩"可进行评价'] msg.append('Support by pcrdfans_com') await session.send('\n'.join(msg))
async def _arena_query(session:CommandSession, region:int): arena.refresh_quick_key_dic() uid = session.ctx['user_id'] if not lmt.check(uid): session.finish('您查询得过于频繁,请稍等片刻', at_sender=True) lmt.start_cd(uid) # 处理输入数据 argv = session.current_arg_text.strip() argv = re.sub(r'[??,,_]', ' ', argv) argv = argv.split() if 0 >= len(argv): session.finish('请输入防守方角色,用空格隔开', at_sender=True) if 5 < len(argv): session.finish('编队不能多于5名角色', at_sender=True) defen = [ Chara.name2id(name) for name in argv ] for i, id_ in enumerate(defen): if Chara.UNKNOWN == id_: await session.finish(f'编队中含未知角色"{argv[i]}",请尝试使用官方译名\n您可@bot来杯咖啡+反馈未收录别称\n或前往 github.com/Ice-Cirno/HoshinoBot/issues/5 回帖补充', at_sender=True) if len(defen) != len(set(defen)): await session.finish('编队中出现重复角色', at_sender=True) if 1004 in defen: await session.send('\n⚠️您正在查询普通版炸弹人\n※万圣版可用万圣炸弹人/瓜炸等别称', at_sender=True) # 执行查询 sv.logger.info('Doing query...') res = await arena.do_query(defen, uid, region) sv.logger.info('Got response!') # 处理查询结果 if res is None: session.finish('查询出错,请联系维护组调教\n请先移步pcrdfans.com进行查询', at_sender=True) if not len(res): session.finish('抱歉没有查询到解法\n※没有作业说明随便拆 发挥你的想象力~★\n作业上传请前往pcrdfans.com', at_sender=True) res = res[:min(6, len(res))] # 限制显示数量,截断结果 # 发送回复 if get_bot().config.IS_CQPRO: sv.logger.info('Arena generating picture...') atk_team = [ Chara.gen_team_pic(entry['atk']) for entry in res ] atk_team = concat_pic(atk_team) atk_team = pic2b64(atk_team) atk_team = str(MessageSegment.image(atk_team)) sv.logger.info('Arena picture ready!') else: atk_team = '\n'.join(map(lambda entry: ' '.join(map(lambda x: f"{x.name}{x.star if x.star else ''}{'专' if x.equip else ''}" , entry['atk'])) , res)) details = [ " ".join([ f"赞{e['up']}+{e['my_up']}" if e['my_up'] else f"赞{e['up']}", f"踩{e['down']}+{e['my_down']}" if e['my_down'] else f"踩{e['down']}", e['qkey'] ]) for e in res ] defen = [ Chara.fromid(x).name for x in defen ] defen = f"防守方【{' '.join(defen)}】" at = str(MessageSegment.at(session.ctx["user_id"])) msg1 = [ defen, f'已为骑士{at}查询到以下进攻方案:', f'{atk_team}Support by pcrdfans_com' ] msg2 = [ f'为骑士{at}查询到作业评价👍&👎:', *details, '※发送"点赞/点踩"可进行评价', '※手机QQ无法正常显示图片故分条发送 如有刷屏还请谅解', ] if region == 1: msg2.append('※使用"b怎么拆"或"台怎么拆"可按服过滤') sv.logger.debug('Arena sending result...') await session.send('\n'.join(msg1)) await session.send('\n'.join(msg2)) sv.logger.debug('Arena result sent!')
async def admin_only_func(event, bot): count = 0 # 正式的消息处理 selfid = event['self_id'] senderid = event['user_id'] groupid = event['group_id'] # 分割文本信息,at信息,图片信息等等 allmsg = event['message'] msgtext = [] msgat = [] for msg in allmsg: if msg['type'] == 'text': msgtext.append(msg['data']['text']) elif msg['type'] == 'at' and msg['data']['qq'] != 'all': msgat.append(int(msg['data']['qq'])) elif msg['type'] == 'image': pass msg = M() # “一带一路”功能,允许一个群成员选择另一个群成员一起被禁言,时长控制为1-9分钟 msgtextstr = ''.join(msgtext) if '一带一路' in msgtextstr and msgat: if groupdict[selfid][groupid]['member'][selfid]['role'] <= groupdict[ selfid][groupid]['member'][senderid]['role']: msg.append(MS.text('权限狗无法参与(请自裁')) else: if len(msgat) > 1: msg.append(MS.text('是不是太贪心了呢')) elif senderid == msgat[0]: msg.append(MS.text('你成功促进了自己的经济发展')) elif groupdict[selfid][groupid]['member'][selfid][ 'role'] > groupdict[selfid][groupid]['member'][ msgat[0]]['role']: msg.append(MS.text('你成功带动了')) msg.append(MS.at(msgat[0])) msg.append(MS.text('的经济发展')) await bot.set_group_ban(self_id=selfid, group_id=groupid, user_id=msgat[0], duration=random.randint(1, 9) * 60) else: msg.append(MS.text('没有符合帮扶政策的群员,你将独享')) await bot.set_group_ban(self_id=selfid, group_id=groupid, user_id=senderid, duration=random.randint(1, 9) * 60) if msg: await bot.send_group_msg(self_id=selfid, group_id=groupid, message=msg) count += 1 # “抽奖”功能,允许一个群成员禁言自己,娱乐用,时长控制为1-9分钟 if re.match(r'.*抽.*奖.*', msgtextstr): if groupdict[selfid][groupid]['member'][selfid]['role'] <= groupdict[ selfid][groupid]['member'][senderid]['role']: msg.append(MS.text('权限狗无法参与(请自裁')) # “大抽奖”功能,抽奖升级版,时长控制为4-8小时 elif re.match(r'.*[大带(da)].*抽.*奖.*', msgtextstr): await bot.set_group_ban(self_id=selfid, group_id=groupid, user_id=senderid, duration=random.randint(240, 480) * 60) else: await bot.set_group_ban(self_id=selfid, group_id=groupid, user_id=senderid, duration=random.randint(1, 9) * 60) if msg: await bot.send_group_msg(self_id=selfid, group_id=groupid, message=msg) count += 1 return 1 if count > 0 else 0
async def handle_group_invite(session: RequestSession): print('收到邀请收到邀请收到邀请收到邀请收到邀请') ev = session.event # if ev.self_id == one: # return None print(ev) try: try: group_info = await session.bot.get_group_info(group_id=ev.group_id, self_id=ev.self_id) group_name = group_info["group_name"] except Exception as err: group_name = f'[获取失败]' group_id = ev.group_id at = MessageSegment.at(614867321) at2 = MessageSegment.at(ev.user_id) if ev.self_id != five: await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup, message=f'群号:{ev.group_id}\n群名:{group_name}\n方式:{ev.sub_type}\n邀请人:{at2}\n❗请不要拉小日向1/2/3/4号机,请邀请5号机') await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup2, message=f'群号:{ev.group_id}\n群名:{group_name}\n方式:{ev.sub_type}\n邀请人:{at2}\n❗请不要拉小日向1/2/3/4号机,请邀请5号机') return None group_list[ev.group_id] = {'flag': f'{ev.flag}', 'sub_type': f'{ev.sub_type}', 'group_name': f'{group_name}', 'user_id': f'{ev.user_id}', 'self_id': f'{ev.self_id}' } # comment = ev.comment length = len(group_list) print(ev) # if ev.self_id == one: # print('enterif') # await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup, # message=f'{at2}目前1号机已经满额啦,请尝试拉2号机哈\n❗群号:{group_id}\n❗群名:{group_name}\n') # print('通知发送成功') # await session.bot.set_group_add_request(flag=ev.flag, sub_type=ev.sub_type, approve=False, reason='请邀请小日向2号机') # print('拒绝成功') # del group_list[int(group_id)] # return None # else: await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup, message=f'{at}\n👉收到1条群组请求\n群号:{ev.group_id}\n群名:{group_name}\n方式:{ev.sub_type}\n邀请人:{at2}\n目前剩余{length}条请求未处理\n如果该请求未自动同意请联系群主') group_id = str(ev.group_id) if group_id in 购买记录 and 购买记录[group_id]['days'] >= 0: print('Test') try: await session.bot.set_group_add_request(self_id=ev.self_id, flag=ev.flag, sub_type=ev.sub_type, approve=True) await asyncio.sleep(1) print('邀请成功邀请成功邀请成功邀请成功邀请成功邀请成功') await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup, message=f'{at2}该群已授权,已自动同意\n✅群号:{group_id}\n✅群名:{group_name}') await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup2, message=f'{at2}该群已授权,已自动同意\n✅群号:{group_id}\n✅群名:{group_name}') del group_list[int(group_id)] return None except Exception as err: await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup, message=f'{at2}该群已授权,自动同意失败,可以再邀请试试\n❗群号:{group_id}\n❗群名:{group_name}\n{err}') await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup2, message=f'{at2}该群已授权,自动同意失败,可以再邀请试试\n❗群号:{group_id}\n❗群名:{group_name}\n{err}') del group_list[int(group_id)] # await session.bot.send_private_msg(self_id=ev.self_id, user_id=614867321, # message=f'收到group_request\n{comment}\n剩余{length}条请求未处理') # user_id = ev.user_id # user_info = await session.bot.get_stranger_info(user_id=user_id) # nickname = user_info['nickname'] except Exception as e: await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup, message=f'{at}\n👉收到1条群组请求\n❗异常:{e}\n群号:{ev.group_id}\n') await session.bot.send_group_msg(self_id=ev.self_id, group_id=messageGroup2, message=f'{at}\n👉收到1条群组请求\n❗异常:{e}\n群号:{ev.group_id}\n')
def _(session: CommandSession): nowBlacklist: list = PluginManager.settings(__plugin_name__, session.event).settings return ("目前" + "".join(map(lambda x: str(MessageSegment.at(x)), nowBlacklist)) + "在黑名单上")
async def update_rec(gid: int, uid: int, dmg: int, remark: dict = {}): rec_type = 0 over_kill = -1 member_name = battleObj.get_member_name(gid, uid) if member_name is None: battleObj.add_member(gid, uid, await get_member_name(gid, uid)) member_name = battleObj.get_member_name(gid, uid) msg = member_name _, prev_round, prev_boss, prev_hp = battleObj.get_current_state(gid) if dmg >= prev_hp: over_kill = dmg rec_type = 1 dmg = prev_hp if dmg == -1 or dmg == prev_hp: rec_type = 1 dmg = prev_hp member_recs = battleObj.get_rec(gid, uid, get_start_of_day()) member_today_rec_nums, flag = 0, 0 for rec in member_recs: flag = rec['flag'] if flag in [0, 2, 3]: member_today_rec_nums += 1 if member_today_rec_nums >= 3: await bot.send_group_msg(group_id=gid, message='你今天已经报满三刀了') return dmg_type, new_flag = '整刀', rec_type if flag in [0, 2, 3]: dmg_type = ['整刀', '尾刀'][rec_type] else: # flag = 1 dmg_type = ['余刀', '余尾刀'][rec_type] new_flag = 2 + rec_type msg += '对%d周目%s造成了%s伤害' % (prev_round, boss_names[prev_boss], format_num(dmg)) msg += '(今日第%d刀,%s)。' % (member_today_rec_nums + 1, dmg_type) if new_flag == 1 and over_kill > 0: time_remain = 0 if 'remain' in remark: time_remain = remark['remain'] time_return = math.ceil( bc_calc_time_return(prev_hp, over_kill, time_remain)) remark['remain'] = time_return msg += '\n造成过量伤害%s,余时%s秒,补偿刀返还时间%s秒。' % (format_num(over_kill), time_remain, time_return) cancel_reserve(gid, uid, prev_boss) _, _, after_boss, _ = add_rec(gid, uid, prev_round, prev_boss, dmg, new_flag, remark) if prev_boss != after_boss: trees = '' enters = battleObj.get_enter(gid) for e in enters: if e['flag'] == 1: trees += str(MessageSegment.at(e['uid'])) if len(trees) > 0: msg += f'\n- 可以下树了{trees}' on_reverse = call_reserve(gid, after_boss) msg += f'\n- 新的{boss_names[after_boss]}已经出现{on_reverse}' clear_enter(gid) del_enter(gid, uid) await bot.send_group_msg(group_id=gid, message=msg) if prev_boss == after_boss: msg = await get_progress_message(gid) await bot.send_group_msg(group_id=gid, message=msg)
async def call_master(session: NLPSession): session.send(MessageSegment.at(session.bot.config.SUPERUSERS[0]))
async def vote(s: CommandSession, user, group, user_in_group, state): parser = ArgumentParser(session=s, usage=USAGE) parser.add_argument( 'command', choices=['list', 'new', 'yea', 'nay', 'commit', 'count', 'announce']) parser.add_argument('ITEM') parser.add_argument('extra', nargs='?') args = parser.parse_args(s.argv) name = args.ITEM.strip() db: orm.Session = orm.getSession() vote_item = db.query(VoteItem).filter(VoteItem.GroupId == group.GroupId, VoteItem.Name == name).one_or_none() try: if args.command == 'list': msg = Message("List of available vote items:\n") items = None if args.extra == 'all': # Extract all items items = db.query(VoteItem).filter( VoteItem.GroupId == group.GroupId).all() else: # Extract active items items = db.query(VoteItem).filter( VoteItem.GroupId == group.GroupId, VoteItem.Committed == False).all() for item in items: msg.append( MessageSegment.text( f"'{item.Name}' - {item.Description}\n")) await s.send(msg) elif args.command == 'new': if not vote_item: if not args.extra: desc = f"Vote on {name}" else: desc = args.extra item = VoteItem(GroupId=group.GroupId, ProposerId=user.UserId, Name=name, Committed=False, Description=desc) db.add(item) db.commit() await s.send( f"Vote item '{item.Description}' ({item.Name}) created.", at_sender=True) else: await s.send(f"Vote item '{vote_item.Name}' already exisist.", at_sender=True) elif args.command == 'yea': if not vote_item: raise _VoteItemNotFound() if vote_item.Committed: raise _VoteClosed() vote = db.query(Vote).filter( Vote.Item == vote_item.Id, Vote.Voter == user.UserId).one_or_none() if not vote: vote = Vote(Item=vote_item.Id, Voter=user.UserId, Ballot=_BALLOT_YEA) db.add(vote) else: vote.Ballot = _BALLOT_YEA db.commit() await s.send( f"You voted YES to '{vote_item.Description}' ({vote_item.Name}).", at_sender=True) elif args.command == 'nay': if not vote_item: raise _VoteItemNotFound if vote_item.Committed: raise _VoteClosed vote = db.query(Vote).filter( Vote.Item == vote_item.Id, Vote.Voter == user.UserId).one_or_none() if not vote: vote = Vote(Item=vote_item.Id, Voter=user.UserId, Ballot=_BALLOT_NAY) db.add(vote) else: vote.Ballot = _BALLOT_NAY db.commit() await s.send( f"You voted NO to '{vote_item.Description}' ({vote_item.Name}).", at_sender=True) elif args.command == 'commit': if not vote_item: raise _VoteItemNotFound() if vote_item.ProposerId != user.UserId: raise _NotVoteOwner() vote_item.Committed = True db.commit() await s.send( f"You concluded vote item '{vote_item.Description}' ({vote_item.Name}).", at_sender=True) elif args.command == 'count': if not vote_item: raise _VoteItemNotFound total_count = db.query(Vote).filter( Vote.Item == vote_item.Id).count() positives = db.query(Vote).filter( Vote.Item == vote_item.Id, Vote.Ballot == _BALLOT_YEA).count() await s.send( f"Vote item '{vote_item.Description}' ({vote_item.Name}) got {positives} YES among {total_count} votes." ) elif args.command == 'announce': if not vote_item: raise _VoteItemNotFound total_count = db.query(Vote).filter( Vote.Item == vote_item.Id).count() # proposer = db.query(orm.User).filter(orm.User.UserId==vote_item.ProposerId).one() positives = db.query(Vote).filter( Vote.Item == vote_item.Id, Vote.Ballot == _BALLOT_YEA).all() # positives = db.query(Vote, orm.User) \ # .join(Vote.Voter == orm.User.UserId) \ # .filter(Item=vote_item.Id, Ballot=_BALLOT_YEA) \ # .all() msg = nonebot.Message( f"Vote item '{vote_item.Description}' ({vote_item.Name}) initiated by " ) msg.append(MessageSegment.at(vote_item.ProposerId)) msg.append( MessageSegment.text( f" got {len(positives)} YES among {total_count} votes. ")) msg.append( MessageSegment.text( f"The following users in favor of the item:")) segs = [ nonebot.MessageSegment.at(vote.Voter) for vote in positives ] for seg in segs: msg.append(seg) await s.send(msg) else: raise Exception except _VoteItemNotFound: await s.send(f"Vote item '{name}' does not exist.", at_sender=True) except _NotVoteOwner: await s.send(f"You does not own vote item '{name}'.", at_sender=True) except _VoteClosed: await s.send(f"Voting for '{name}' is already closed.", at_sender=True)
def build(cls, text: str): if text.startswith('@'): if text[1:].isdecimal(): return MessageSegment.at(int(text[1:])) else: return MessageSegment.text(text)